From 71b256aad56f7e528db285035ff30cee9846934a Mon Sep 17 00:00:00 2001 From: diegosouzapw Date: Sat, 18 Apr 2026 02:57:53 -0300 Subject: [PATCH] docs(i18n): remove incorrectly translated internal source and reporting folders --- .../ar/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/ar/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../ar/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/ar/_ideia/defer/787-auto-research.md | 20 - .../ar/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/ar/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../ar/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../ar/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../ar/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/ar/src/lib/a2a/README.md | 752 ------------------ .../bg/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/bg/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../bg/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/bg/_ideia/defer/787-auto-research.md | 20 - .../bg/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/bg/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../bg/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../bg/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../bg/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/bg/src/lib/a2a/README.md | 752 ------------------ .../cs/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/cs/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../cs/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/cs/_ideia/defer/787-auto-research.md | 20 - .../cs/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/cs/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../cs/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../cs/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../cs/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/cs/src/lib/a2a/README.md | 752 ------------------ .../da/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/da/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../da/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/da/_ideia/defer/787-auto-research.md | 20 - .../da/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/da/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../da/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../da/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../da/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/da/src/lib/a2a/README.md | 752 ------------------ .../de/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/de/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../de/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/de/_ideia/defer/787-auto-research.md | 20 - .../de/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/de/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../de/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../de/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../de/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/de/src/lib/a2a/README.md | 752 ------------------ .../es/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/es/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../es/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/es/_ideia/defer/787-auto-research.md | 20 - .../es/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/es/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../es/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../es/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../es/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/es/src/lib/a2a/README.md | 752 ------------------ .../fi/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/fi/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../fi/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/fi/_ideia/defer/787-auto-research.md | 20 - .../fi/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/fi/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../fi/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../fi/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../fi/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/fi/src/lib/a2a/README.md | 752 ------------------ .../fr/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/fr/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../fr/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/fr/_ideia/defer/787-auto-research.md | 20 - .../fr/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/fr/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../fr/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../fr/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../fr/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/fr/src/lib/a2a/README.md | 752 ------------------ .../he/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/he/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../he/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/he/_ideia/defer/787-auto-research.md | 20 - .../he/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/he/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../he/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../he/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../he/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/he/src/lib/a2a/README.md | 752 ------------------ .../hi/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/hi/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../hi/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/hi/_ideia/defer/787-auto-research.md | 20 - .../hi/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/hi/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../hi/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../hi/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../hi/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/hi/src/lib/a2a/README.md | 752 ------------------ .../hu/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/hu/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../hu/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/hu/_ideia/defer/787-auto-research.md | 20 - .../hu/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/hu/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../hu/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../hu/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../hu/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/hu/src/lib/a2a/README.md | 752 ------------------ .../id/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/id/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../id/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/id/_ideia/defer/787-auto-research.md | 20 - .../id/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/id/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../id/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../id/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../id/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/id/src/lib/a2a/README.md | 752 ------------------ .../in/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/in/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../in/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/in/_ideia/defer/787-auto-research.md | 20 - .../in/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/in/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../in/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../in/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../in/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/in/src/lib/a2a/README.md | 752 ------------------ .../it/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/it/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../it/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/it/_ideia/defer/787-auto-research.md | 20 - .../it/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/it/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../it/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../it/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../it/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/it/src/lib/a2a/README.md | 752 ------------------ .../ja/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/ja/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../ja/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/ja/_ideia/defer/787-auto-research.md | 20 - .../ja/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/ja/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../ja/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../ja/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../ja/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/ja/src/lib/a2a/README.md | 752 ------------------ .../ko/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/ko/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../ko/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/ko/_ideia/defer/787-auto-research.md | 20 - .../ko/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/ko/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../ko/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../ko/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../ko/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/ko/src/lib/a2a/README.md | 752 ------------------ .../ms/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/ms/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../ms/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/ms/_ideia/defer/787-auto-research.md | 20 - .../ms/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/ms/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../ms/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../ms/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../ms/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/ms/src/lib/a2a/README.md | 752 ------------------ .../nl/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/nl/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../nl/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/nl/_ideia/defer/787-auto-research.md | 20 - .../nl/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/nl/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../nl/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../nl/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../nl/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/nl/src/lib/a2a/README.md | 752 ------------------ .../no/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/no/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../no/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/no/_ideia/defer/787-auto-research.md | 20 - .../no/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/no/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../no/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../no/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../no/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/no/src/lib/a2a/README.md | 752 ------------------ .../_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/phi/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../_ideia/defer/785-task-class-routing.md | 41 - .../phi/_ideia/defer/787-auto-research.md | 20 - .../phi/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - .../i18n/phi/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/phi/src/lib/a2a/README.md | 752 ------------------ .../pl/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/pl/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../pl/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/pl/_ideia/defer/787-auto-research.md | 20 - .../pl/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/pl/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../pl/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../pl/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../pl/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/pl/src/lib/a2a/README.md | 752 ------------------ .../_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- .../pt-BR/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../_ideia/defer/785-task-class-routing.md | 41 - .../pt-BR/_ideia/defer/787-auto-research.md | 20 - .../pt-BR/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - .../pt-BR/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/pt-BR/src/lib/a2a/README.md | 752 ------------------ .../pt/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/pt/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../pt/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/pt/_ideia/defer/787-auto-research.md | 20 - .../pt/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/pt/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../pt/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../pt/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../pt/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/pt/src/lib/a2a/README.md | 752 ------------------ .../ro/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/ro/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../ro/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/ro/_ideia/defer/787-auto-research.md | 20 - .../ro/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/ro/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../ro/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../ro/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../ro/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/ro/src/lib/a2a/README.md | 752 ------------------ .../ru/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/ru/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../ru/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/ru/_ideia/defer/787-auto-research.md | 20 - .../ru/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/ru/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../ru/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../ru/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../ru/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/ru/src/lib/a2a/README.md | 752 ------------------ .../sk/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/sk/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../sk/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/sk/_ideia/defer/787-auto-research.md | 20 - .../sk/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/sk/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../sk/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../sk/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../sk/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/sk/src/lib/a2a/README.md | 752 ------------------ .../sv/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/sv/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../sv/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/sv/_ideia/defer/787-auto-research.md | 20 - .../sv/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/sv/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../sv/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../sv/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../sv/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/sv/src/lib/a2a/README.md | 752 ------------------ .../th/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/th/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../th/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/th/_ideia/defer/787-auto-research.md | 20 - .../th/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/th/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../th/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../th/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../th/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/th/src/lib/a2a/README.md | 752 ------------------ .../tr/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/tr/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../tr/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/tr/_ideia/defer/787-auto-research.md | 20 - .../tr/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/tr/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../tr/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../tr/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../tr/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/tr/src/lib/a2a/README.md | 752 ------------------ .../_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- .../uk-UA/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../_ideia/defer/785-task-class-routing.md | 41 - .../uk-UA/_ideia/defer/787-auto-research.md | 20 - .../uk-UA/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - .../uk-UA/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/uk-UA/src/lib/a2a/README.md | 752 ------------------ .../vi/_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- docs/i18n/vi/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../vi/_ideia/defer/785-task-class-routing.md | 41 - .../i18n/vi/_ideia/defer/787-auto-research.md | 20 - .../vi/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - docs/i18n/vi/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../vi/_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../vi/_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../vi/_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/vi/src/lib/a2a/README.md | 752 ------------------ .../_ideia/defer/1041-smart-auto-combos.md | 63 -- .../defer/1112-providers-dynamic-plugins.md | 64 -- ...ng-and-refresh-the-github-model-catalog.md | 105 --- .../zh-CN/_ideia/defer/1182-tps-metric.md | 63 -- ...port-and-fix-tool-calling-compatibility.md | 65 -- ...xtract-crawl-map-and-research-endpoints.md | 114 --- .../defer/1251-minimax-oauth-provider.md | 60 -- .../defer/1276-freepik-pikaso-provider.md | 58 -- .../defer/1305-per-key-token-rate-limiting.md | 75 -- .../_ideia/defer/1320-rate-limit-headers.md | 71 -- .../defer/1339-api-key-routing-rules.md | 59 -- .../_ideia/defer/785-task-class-routing.md | 41 - .../zh-CN/_ideia/defer/787-auto-research.md | 20 - .../zh-CN/_ideia/defer/792-team-of-rivals.md | 20 - .../_ideia/defer/797-hierarchical-router.md | 20 - .../defer/801-cross-provider-diversity.md | 27 - .../zh-CN/_ideia/defer/980-lkgp-routing.md | 47 -- .../notfit/1023-providers-independent.md | 43 - .../_ideia/notfit/1046-native-playground.md | 80 -- .../_ideia/notfit/1100-headroom-support.md | 61 -- .../notfit/1110-whitelist-models-api-key.md | 65 -- .../_ideia/notfit/1129-automated-hermes.md | 42 - .../_ideia/notfit/1132-venice-ai-provider.md | 40 - .../_ideia/notfit/1191-filter-custom-model.md | 39 - ...e-gpt-image-1-and-gpt-iamge-1-5-support.md | 75 -- ...een-token-health-check-sweep-iterations.md | 93 --- .../1364-enforce-tests-before-release.md | 35 - .../_ideia/notfit/804-9router-migration.md | 24 - .../notfit/833-termux-android-support.md | 55 -- .../_ideia/notfit/907-codex-in-claude-code.md | 38 - .../_ideia/notfit/945-telegram-integration.md | 42 - .../notfit/973-custom-provider-image-gen.md | 50 -- .../_ideia/notfit/982-codex-prompt-caching.md | 44 - ...-governanca-de-ownership-por-credencial.md | 143 ---- .../viable/1350-persist-api-key-docker.md | 79 -- .../viable/1367-limit-db-backup-count.md | 67 -- .../_ideia/viable/1369-reduce-gpu-usage-ui.md | 75 -- .../1308-meta-muse-spark-provider.md | 81 -- docs/i18n/zh-CN/src/lib/a2a/README.md | 752 ------------------ 1248 files changed, 95840 deletions(-) delete mode 100644 docs/i18n/ar/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/ar/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/ar/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/ar/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/ar/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/ar/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/ar/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/ar/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/ar/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/ar/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/ar/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/ar/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/ar/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/ar/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/ar/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/ar/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/ar/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/ar/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/ar/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/ar/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/ar/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/ar/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/ar/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/ar/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/ar/src/lib/a2a/README.md delete mode 100644 docs/i18n/bg/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/bg/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/bg/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/bg/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/bg/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/bg/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/bg/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/bg/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/bg/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/bg/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/bg/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/bg/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/bg/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/bg/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/bg/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/bg/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/bg/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/bg/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/bg/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/bg/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/bg/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/bg/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/bg/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/bg/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/bg/src/lib/a2a/README.md delete mode 100644 docs/i18n/cs/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/cs/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/cs/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/cs/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/cs/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/cs/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/cs/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/cs/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/cs/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/cs/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/cs/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/cs/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/cs/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/cs/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/cs/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/cs/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/cs/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/cs/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/cs/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/cs/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/cs/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/cs/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/cs/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/cs/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/cs/src/lib/a2a/README.md delete mode 100644 docs/i18n/da/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/da/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/da/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/da/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/da/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/da/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/da/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/da/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/da/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/da/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/da/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/da/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/da/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/da/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/da/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/da/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/da/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/da/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/da/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/da/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/da/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/da/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/da/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/da/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/da/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/da/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/da/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/da/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/da/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/da/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/da/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/da/src/lib/a2a/README.md delete mode 100644 docs/i18n/de/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/de/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/de/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/de/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/de/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/de/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/de/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/de/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/de/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/de/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/de/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/de/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/de/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/de/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/de/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/de/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/de/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/de/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/de/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/de/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/de/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/de/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/de/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/de/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/de/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/de/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/de/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/de/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/de/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/de/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/de/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/de/src/lib/a2a/README.md delete mode 100644 docs/i18n/es/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/es/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/es/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/es/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/es/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/es/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/es/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/es/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/es/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/es/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/es/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/es/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/es/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/es/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/es/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/es/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/es/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/es/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/es/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/es/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/es/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/es/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/es/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/es/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/es/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/es/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/es/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/es/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/es/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/es/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/es/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/es/src/lib/a2a/README.md delete mode 100644 docs/i18n/fi/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/fi/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/fi/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/fi/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/fi/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/fi/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/fi/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/fi/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/fi/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/fi/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/fi/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/fi/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/fi/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/fi/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/fi/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/fi/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/fi/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/fi/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/fi/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/fi/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/fi/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/fi/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/fi/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/fi/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/fi/src/lib/a2a/README.md delete mode 100644 docs/i18n/fr/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/fr/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/fr/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/fr/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/fr/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/fr/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/fr/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/fr/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/fr/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/fr/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/fr/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/fr/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/fr/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/fr/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/fr/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/fr/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/fr/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/fr/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/fr/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/fr/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/fr/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/fr/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/fr/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/fr/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/fr/src/lib/a2a/README.md delete mode 100644 docs/i18n/he/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/he/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/he/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/he/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/he/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/he/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/he/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/he/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/he/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/he/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/he/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/he/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/he/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/he/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/he/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/he/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/he/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/he/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/he/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/he/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/he/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/he/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/he/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/he/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/he/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/he/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/he/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/he/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/he/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/he/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/he/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/he/src/lib/a2a/README.md delete mode 100644 docs/i18n/hi/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/hi/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/hi/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/hi/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/hi/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/hi/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/hi/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/hi/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/hi/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/hi/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/hi/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/hi/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/hi/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/hi/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/hi/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/hi/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/hi/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/hi/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/hi/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/hi/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/hi/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/hi/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/hi/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/hi/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/hi/src/lib/a2a/README.md delete mode 100644 docs/i18n/hu/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/hu/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/hu/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/hu/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/hu/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/hu/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/hu/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/hu/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/hu/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/hu/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/hu/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/hu/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/hu/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/hu/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/hu/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/hu/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/hu/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/hu/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/hu/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/hu/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/hu/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/hu/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/hu/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/hu/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/hu/src/lib/a2a/README.md delete mode 100644 docs/i18n/id/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/id/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/id/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/id/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/id/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/id/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/id/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/id/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/id/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/id/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/id/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/id/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/id/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/id/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/id/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/id/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/id/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/id/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/id/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/id/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/id/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/id/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/id/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/id/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/id/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/id/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/id/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/id/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/id/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/id/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/id/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/id/src/lib/a2a/README.md delete mode 100644 docs/i18n/in/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/in/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/in/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/in/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/in/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/in/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/in/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/in/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/in/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/in/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/in/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/in/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/in/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/in/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/in/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/in/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/in/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/in/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/in/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/in/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/in/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/in/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/in/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/in/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/in/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/in/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/in/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/in/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/in/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/in/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/in/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/in/src/lib/a2a/README.md delete mode 100644 docs/i18n/it/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/it/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/it/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/it/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/it/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/it/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/it/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/it/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/it/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/it/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/it/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/it/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/it/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/it/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/it/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/it/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/it/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/it/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/it/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/it/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/it/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/it/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/it/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/it/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/it/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/it/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/it/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/it/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/it/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/it/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/it/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/it/src/lib/a2a/README.md delete mode 100644 docs/i18n/ja/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/ja/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/ja/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/ja/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/ja/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/ja/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/ja/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/ja/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/ja/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/ja/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/ja/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/ja/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/ja/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/ja/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/ja/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/ja/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/ja/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/ja/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/ja/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/ja/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/ja/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/ja/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/ja/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/ja/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/ja/src/lib/a2a/README.md delete mode 100644 docs/i18n/ko/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/ko/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/ko/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/ko/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/ko/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/ko/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/ko/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/ko/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/ko/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/ko/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/ko/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/ko/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/ko/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/ko/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/ko/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/ko/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/ko/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/ko/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/ko/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/ko/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/ko/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/ko/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/ko/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/ko/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/ko/src/lib/a2a/README.md delete mode 100644 docs/i18n/ms/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/ms/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/ms/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/ms/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/ms/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/ms/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/ms/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/ms/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/ms/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/ms/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/ms/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/ms/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/ms/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/ms/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/ms/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/ms/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/ms/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/ms/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/ms/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/ms/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/ms/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/ms/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/ms/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/ms/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/ms/src/lib/a2a/README.md delete mode 100644 docs/i18n/nl/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/nl/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/nl/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/nl/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/nl/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/nl/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/nl/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/nl/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/nl/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/nl/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/nl/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/nl/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/nl/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/nl/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/nl/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/nl/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/nl/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/nl/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/nl/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/nl/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/nl/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/nl/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/nl/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/nl/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/nl/src/lib/a2a/README.md delete mode 100644 docs/i18n/no/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/no/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/no/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/no/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/no/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/no/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/no/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/no/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/no/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/no/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/no/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/no/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/no/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/no/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/no/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/no/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/no/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/no/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/no/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/no/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/no/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/no/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/no/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/no/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/no/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/no/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/no/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/no/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/no/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/no/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/no/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/no/src/lib/a2a/README.md delete mode 100644 docs/i18n/phi/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/phi/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/phi/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/phi/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/phi/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/phi/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/phi/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/phi/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/phi/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/phi/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/phi/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/phi/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/phi/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/phi/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/phi/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/phi/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/phi/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/phi/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/phi/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/phi/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/phi/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/phi/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/phi/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/phi/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/phi/src/lib/a2a/README.md delete mode 100644 docs/i18n/pl/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/pl/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/pl/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/pl/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/pl/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/pl/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/pl/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/pl/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/pl/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/pl/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/pl/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/pl/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/pl/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/pl/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/pl/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/pl/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/pl/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/pl/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/pl/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/pl/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/pl/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/pl/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/pl/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/pl/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/pl/src/lib/a2a/README.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/pt-BR/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/pt-BR/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/pt-BR/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/pt-BR/src/lib/a2a/README.md delete mode 100644 docs/i18n/pt/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/pt/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/pt/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/pt/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/pt/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/pt/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/pt/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/pt/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/pt/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/pt/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/pt/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/pt/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/pt/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/pt/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/pt/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/pt/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/pt/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/pt/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/pt/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/pt/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/pt/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/pt/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/pt/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/pt/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/pt/src/lib/a2a/README.md delete mode 100644 docs/i18n/ro/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/ro/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/ro/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/ro/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/ro/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/ro/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/ro/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/ro/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/ro/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/ro/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/ro/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/ro/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/ro/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/ro/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/ro/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/ro/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/ro/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/ro/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/ro/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/ro/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/ro/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/ro/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/ro/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/ro/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/ro/src/lib/a2a/README.md delete mode 100644 docs/i18n/ru/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/ru/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/ru/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/ru/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/ru/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/ru/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/ru/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/ru/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/ru/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/ru/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/ru/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/ru/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/ru/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/ru/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/ru/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/ru/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/ru/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/ru/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/ru/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/ru/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/ru/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/ru/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/ru/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/ru/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/ru/src/lib/a2a/README.md delete mode 100644 docs/i18n/sk/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/sk/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/sk/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/sk/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/sk/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/sk/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/sk/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/sk/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/sk/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/sk/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/sk/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/sk/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/sk/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/sk/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/sk/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/sk/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/sk/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/sk/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/sk/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/sk/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/sk/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/sk/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/sk/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/sk/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/sk/src/lib/a2a/README.md delete mode 100644 docs/i18n/sv/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/sv/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/sv/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/sv/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/sv/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/sv/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/sv/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/sv/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/sv/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/sv/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/sv/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/sv/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/sv/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/sv/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/sv/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/sv/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/sv/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/sv/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/sv/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/sv/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/sv/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/sv/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/sv/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/sv/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/sv/src/lib/a2a/README.md delete mode 100644 docs/i18n/th/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/th/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/th/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/th/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/th/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/th/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/th/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/th/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/th/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/th/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/th/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/th/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/th/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/th/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/th/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/th/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/th/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/th/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/th/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/th/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/th/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/th/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/th/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/th/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/th/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/th/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/th/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/th/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/th/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/th/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/th/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/th/src/lib/a2a/README.md delete mode 100644 docs/i18n/tr/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/tr/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/tr/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/tr/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/tr/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/tr/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/tr/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/tr/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/tr/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/tr/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/tr/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/tr/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/tr/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/tr/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/tr/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/tr/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/tr/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/tr/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/tr/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/tr/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/tr/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/tr/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/tr/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/tr/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/tr/src/lib/a2a/README.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/uk-UA/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/uk-UA/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/uk-UA/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/uk-UA/src/lib/a2a/README.md delete mode 100644 docs/i18n/vi/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/vi/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/vi/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/vi/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/vi/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/vi/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/vi/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/vi/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/vi/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/vi/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/vi/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/vi/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/vi/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/vi/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/vi/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/vi/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/vi/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/vi/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/vi/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/vi/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/vi/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/vi/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/vi/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/vi/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/vi/src/lib/a2a/README.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1041-smart-auto-combos.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1182-tps-metric.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1251-minimax-oauth-provider.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1320-rate-limit-headers.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/1339-api-key-routing-rules.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/785-task-class-routing.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/787-auto-research.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/792-team-of-rivals.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/797-hierarchical-router.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/801-cross-provider-diversity.md delete mode 100644 docs/i18n/zh-CN/_ideia/defer/980-lkgp-routing.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1023-providers-independent.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1046-native-playground.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1100-headroom-support.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1129-automated-hermes.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1132-venice-ai-provider.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1191-filter-custom-model.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/804-9router-migration.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/833-termux-android-support.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/907-codex-in-claude-code.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/945-telegram-integration.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/973-custom-provider-image-gen.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/982-codex-prompt-caching.md delete mode 100644 docs/i18n/zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md delete mode 100644 docs/i18n/zh-CN/_ideia/viable/1350-persist-api-key-docker.md delete mode 100644 docs/i18n/zh-CN/_ideia/viable/1367-limit-db-backup-count.md delete mode 100644 docs/i18n/zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md delete mode 100644 docs/i18n/zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md delete mode 100644 docs/i18n/zh-CN/src/lib/a2a/README.md diff --git a/docs/i18n/ar/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/ar/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 178ba78bc6..0000000000 --- a/docs/i18n/ar/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/ar/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/ar/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 7f79f5dcad..0000000000 --- a/docs/i18n/ar/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index a384a2c926..0000000000 --- a/docs/i18n/ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ar/_ideia/defer/1182-tps-metric.md b/docs/i18n/ar/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 28657889dd..0000000000 --- a/docs/i18n/ar/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 6f39c327af..0000000000 --- a/docs/i18n/ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 425f6d4350..0000000000 --- a/docs/i18n/ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ar/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/ar/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index d5aba8cc6f..0000000000 --- a/docs/i18n/ar/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/ar/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/ar/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 8aa1c3a605..0000000000 --- a/docs/i18n/ar/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/ar/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/ar/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index bc54ee866a..0000000000 --- a/docs/i18n/ar/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/ar/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/ar/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 720759a757..0000000000 --- a/docs/i18n/ar/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/ar/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/ar/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index c8922544c1..0000000000 --- a/docs/i18n/ar/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/ar/_ideia/defer/785-task-class-routing.md b/docs/i18n/ar/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index c07426b022..0000000000 --- a/docs/i18n/ar/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/ar/_ideia/defer/787-auto-research.md b/docs/i18n/ar/_ideia/defer/787-auto-research.md deleted file mode 100644 index 6616fd92de..0000000000 --- a/docs/i18n/ar/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/ar/_ideia/defer/792-team-of-rivals.md b/docs/i18n/ar/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 41a329fccb..0000000000 --- a/docs/i18n/ar/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ar/_ideia/defer/797-hierarchical-router.md b/docs/i18n/ar/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 8a018386a5..0000000000 --- a/docs/i18n/ar/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ar/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/ar/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 19832bc594..0000000000 --- a/docs/i18n/ar/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/ar/_ideia/defer/980-lkgp-routing.md b/docs/i18n/ar/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 469ba29d71..0000000000 --- a/docs/i18n/ar/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/ar/_ideia/notfit/1023-providers-independent.md b/docs/i18n/ar/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 1b83c77418..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/ar/_ideia/notfit/1046-native-playground.md b/docs/i18n/ar/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 7c2b513f63..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/ar/_ideia/notfit/1100-headroom-support.md b/docs/i18n/ar/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 7a0297954e..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/ar/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/ar/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index ba99af4581..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/ar/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/ar/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index c0e9ac4d17..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ar/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/ar/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 9a34ea3196..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ar/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/ar/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 84031fac8a..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index fa63ce65fd..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index d2c8911d4f..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ar/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/ar/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 785f3e7f30..0000000000 --- a/docs/i18n/ar/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/ar/_ideia/notfit/804-9router-migration.md b/docs/i18n/ar/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 982495aa72..0000000000 --- a/docs/i18n/ar/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/ar/_ideia/notfit/833-termux-android-support.md b/docs/i18n/ar/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 16510e5951..0000000000 --- a/docs/i18n/ar/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/ar/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/ar/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index bfdb8c76cd..0000000000 --- a/docs/i18n/ar/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/ar/_ideia/notfit/945-telegram-integration.md b/docs/i18n/ar/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index af01740955..0000000000 --- a/docs/i18n/ar/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/ar/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/ar/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index a44620605d..0000000000 --- a/docs/i18n/ar/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/ar/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/ar/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index c3cb0b8d50..0000000000 --- a/docs/i18n/ar/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index b7c0490bd5..0000000000 --- a/docs/i18n/ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/ar/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/ar/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index ba791915ca..0000000000 --- a/docs/i18n/ar/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ar/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/ar/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 21eb4c9a32..0000000000 --- a/docs/i18n/ar/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ar/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/ar/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 77b6477805..0000000000 --- a/docs/i18n/ar/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 7a19accec8..0000000000 --- a/docs/i18n/ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/ar/src/lib/a2a/README.md b/docs/i18n/ar/src/lib/a2a/README.md deleted file mode 100644 index 010952b237..0000000000 --- a/docs/i18n/ar/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (العربية) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## الهندسة - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## بداية سريعة - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## الرخصة - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/bg/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/bg/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 88d5f26b9e..0000000000 --- a/docs/i18n/bg/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/bg/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/bg/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index d9a92d1ca7..0000000000 --- a/docs/i18n/bg/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index c859b4f636..0000000000 --- a/docs/i18n/bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/bg/_ideia/defer/1182-tps-metric.md b/docs/i18n/bg/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 563504c3a1..0000000000 --- a/docs/i18n/bg/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index cd96af1fca..0000000000 --- a/docs/i18n/bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index f6e2a2f6f9..0000000000 --- a/docs/i18n/bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/bg/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/bg/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 6b2196fb2b..0000000000 --- a/docs/i18n/bg/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/bg/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/bg/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 7d109b874e..0000000000 --- a/docs/i18n/bg/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/bg/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/bg/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index f5f8636982..0000000000 --- a/docs/i18n/bg/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/bg/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/bg/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index d001bc26bc..0000000000 --- a/docs/i18n/bg/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/bg/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/bg/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 72ac2a5d41..0000000000 --- a/docs/i18n/bg/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/bg/_ideia/defer/785-task-class-routing.md b/docs/i18n/bg/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 4e21fdc3c2..0000000000 --- a/docs/i18n/bg/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/bg/_ideia/defer/787-auto-research.md b/docs/i18n/bg/_ideia/defer/787-auto-research.md deleted file mode 100644 index 6c8c2b0515..0000000000 --- a/docs/i18n/bg/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/bg/_ideia/defer/792-team-of-rivals.md b/docs/i18n/bg/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 9a0959f6bf..0000000000 --- a/docs/i18n/bg/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/bg/_ideia/defer/797-hierarchical-router.md b/docs/i18n/bg/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index dfc645efdc..0000000000 --- a/docs/i18n/bg/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/bg/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/bg/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 998e810e42..0000000000 --- a/docs/i18n/bg/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/bg/_ideia/defer/980-lkgp-routing.md b/docs/i18n/bg/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index af176f7692..0000000000 --- a/docs/i18n/bg/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/bg/_ideia/notfit/1023-providers-independent.md b/docs/i18n/bg/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 398e41fd68..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/bg/_ideia/notfit/1046-native-playground.md b/docs/i18n/bg/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index f3aa649deb..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/bg/_ideia/notfit/1100-headroom-support.md b/docs/i18n/bg/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index d466eb35e8..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/bg/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/bg/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index a29842c0fd..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/bg/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/bg/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index ca646138ea..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/bg/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/bg/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index b1b18e4deb..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/bg/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/bg/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 1e2834d050..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index a9319f498b..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 39e02fd66c..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/bg/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/bg/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index d7fd29ee93..0000000000 --- a/docs/i18n/bg/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/bg/_ideia/notfit/804-9router-migration.md b/docs/i18n/bg/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 1c0a369635..0000000000 --- a/docs/i18n/bg/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/bg/_ideia/notfit/833-termux-android-support.md b/docs/i18n/bg/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index a734835cad..0000000000 --- a/docs/i18n/bg/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/bg/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/bg/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 77e894b509..0000000000 --- a/docs/i18n/bg/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/bg/_ideia/notfit/945-telegram-integration.md b/docs/i18n/bg/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index cb0c68c24f..0000000000 --- a/docs/i18n/bg/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/bg/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/bg/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 045cfb636b..0000000000 --- a/docs/i18n/bg/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/bg/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/bg/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index d6f18bb0dd..0000000000 --- a/docs/i18n/bg/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index aaec5a8422..0000000000 --- a/docs/i18n/bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/bg/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/bg/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index c283a6bcc3..0000000000 --- a/docs/i18n/bg/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/bg/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/bg/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 444c855dd3..0000000000 --- a/docs/i18n/bg/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/bg/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/bg/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 71abd34732..0000000000 --- a/docs/i18n/bg/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 47a725f3c0..0000000000 --- a/docs/i18n/bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/bg/src/lib/a2a/README.md b/docs/i18n/bg/src/lib/a2a/README.md deleted file mode 100644 index 82732697a7..0000000000 --- a/docs/i18n/bg/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Български) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Архитектура - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Бърз старт - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Лиценз - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/cs/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/cs/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 8cd6c5a44c..0000000000 --- a/docs/i18n/cs/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/cs/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/cs/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 0e10385119..0000000000 --- a/docs/i18n/cs/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 7e51ba8154..0000000000 --- a/docs/i18n/cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/cs/_ideia/defer/1182-tps-metric.md b/docs/i18n/cs/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index d1f89ec305..0000000000 --- a/docs/i18n/cs/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 0ed02e4ac9..0000000000 --- a/docs/i18n/cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index ad729ad603..0000000000 --- a/docs/i18n/cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/cs/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/cs/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 3916109a6f..0000000000 --- a/docs/i18n/cs/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/cs/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/cs/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index eb84ca5621..0000000000 --- a/docs/i18n/cs/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/cs/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/cs/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 11445ada8f..0000000000 --- a/docs/i18n/cs/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/cs/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/cs/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 6561dd57c8..0000000000 --- a/docs/i18n/cs/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/cs/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/cs/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 828347b6d8..0000000000 --- a/docs/i18n/cs/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/cs/_ideia/defer/785-task-class-routing.md b/docs/i18n/cs/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index b54639a550..0000000000 --- a/docs/i18n/cs/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/cs/_ideia/defer/787-auto-research.md b/docs/i18n/cs/_ideia/defer/787-auto-research.md deleted file mode 100644 index 7f9126d5a4..0000000000 --- a/docs/i18n/cs/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/cs/_ideia/defer/792-team-of-rivals.md b/docs/i18n/cs/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index b95469b241..0000000000 --- a/docs/i18n/cs/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/cs/_ideia/defer/797-hierarchical-router.md b/docs/i18n/cs/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 543894c74b..0000000000 --- a/docs/i18n/cs/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/cs/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/cs/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 5461f61d90..0000000000 --- a/docs/i18n/cs/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/cs/_ideia/defer/980-lkgp-routing.md b/docs/i18n/cs/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index eb22620654..0000000000 --- a/docs/i18n/cs/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/cs/_ideia/notfit/1023-providers-independent.md b/docs/i18n/cs/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 5810cbe4ae..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/cs/_ideia/notfit/1046-native-playground.md b/docs/i18n/cs/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index d04ed7f5d7..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/cs/_ideia/notfit/1100-headroom-support.md b/docs/i18n/cs/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 0ecc15d4bd..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/cs/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/cs/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 458d1e6225..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/cs/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/cs/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 7423a93a9d..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/cs/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/cs/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index dbd3d0f15a..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/cs/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/cs/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index f4740c9f19..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 634b64b986..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 98259679e3..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/cs/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/cs/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index f35065c60f..0000000000 --- a/docs/i18n/cs/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/cs/_ideia/notfit/804-9router-migration.md b/docs/i18n/cs/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 10bcf1f5ed..0000000000 --- a/docs/i18n/cs/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/cs/_ideia/notfit/833-termux-android-support.md b/docs/i18n/cs/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 816abc053a..0000000000 --- a/docs/i18n/cs/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/cs/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/cs/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index ee87705d71..0000000000 --- a/docs/i18n/cs/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/cs/_ideia/notfit/945-telegram-integration.md b/docs/i18n/cs/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 09b9af8d1b..0000000000 --- a/docs/i18n/cs/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/cs/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/cs/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index e656b32a52..0000000000 --- a/docs/i18n/cs/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/cs/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/cs/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index f28329ede5..0000000000 --- a/docs/i18n/cs/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index c9afc04e5c..0000000000 --- a/docs/i18n/cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/cs/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/cs/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 6b92763a6d..0000000000 --- a/docs/i18n/cs/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/cs/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/cs/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 35fa5a0647..0000000000 --- a/docs/i18n/cs/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/cs/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/cs/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index a5e263f723..0000000000 --- a/docs/i18n/cs/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index eb9c58a892..0000000000 --- a/docs/i18n/cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/cs/src/lib/a2a/README.md b/docs/i18n/cs/src/lib/a2a/README.md deleted file mode 100644 index fd0a2146ea..0000000000 --- a/docs/i18n/cs/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Čeština) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architektura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Rychlý start - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licence - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/da/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/da/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 1f7a472552..0000000000 --- a/docs/i18n/da/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/da/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/da/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 56499a523d..0000000000 --- a/docs/i18n/da/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index d9096a8134..0000000000 --- a/docs/i18n/da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/da/_ideia/defer/1182-tps-metric.md b/docs/i18n/da/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 2073b9d8d2..0000000000 --- a/docs/i18n/da/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 9497d8b0e9..0000000000 --- a/docs/i18n/da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 6ea780bae6..0000000000 --- a/docs/i18n/da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/da/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/da/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index f7f0b0cf58..0000000000 --- a/docs/i18n/da/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/da/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/da/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 46e5f2671c..0000000000 --- a/docs/i18n/da/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/da/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/da/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 9aa8c5d8b0..0000000000 --- a/docs/i18n/da/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/da/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/da/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index b1b7535acf..0000000000 --- a/docs/i18n/da/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/da/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/da/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index e904464a94..0000000000 --- a/docs/i18n/da/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/da/_ideia/defer/785-task-class-routing.md b/docs/i18n/da/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 7b0741718c..0000000000 --- a/docs/i18n/da/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/da/_ideia/defer/787-auto-research.md b/docs/i18n/da/_ideia/defer/787-auto-research.md deleted file mode 100644 index ba66cdc978..0000000000 --- a/docs/i18n/da/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/da/_ideia/defer/792-team-of-rivals.md b/docs/i18n/da/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 3d79698a75..0000000000 --- a/docs/i18n/da/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/da/_ideia/defer/797-hierarchical-router.md b/docs/i18n/da/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index a2ec04495e..0000000000 --- a/docs/i18n/da/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/da/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/da/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index e15125971e..0000000000 --- a/docs/i18n/da/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/da/_ideia/defer/980-lkgp-routing.md b/docs/i18n/da/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 1a407c194f..0000000000 --- a/docs/i18n/da/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/da/_ideia/notfit/1023-providers-independent.md b/docs/i18n/da/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 9e44dfc522..0000000000 --- a/docs/i18n/da/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/da/_ideia/notfit/1046-native-playground.md b/docs/i18n/da/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 03e4e3fb9e..0000000000 --- a/docs/i18n/da/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/da/_ideia/notfit/1100-headroom-support.md b/docs/i18n/da/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 7403b323e8..0000000000 --- a/docs/i18n/da/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/da/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/da/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index c5bcd9ba77..0000000000 --- a/docs/i18n/da/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/da/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/da/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index a182fa599f..0000000000 --- a/docs/i18n/da/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/da/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/da/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index e41139a902..0000000000 --- a/docs/i18n/da/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/da/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/da/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 1d522471c8..0000000000 --- a/docs/i18n/da/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 15eefe00d2..0000000000 --- a/docs/i18n/da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 445d6f794f..0000000000 --- a/docs/i18n/da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/da/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/da/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index d9fabce852..0000000000 --- a/docs/i18n/da/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/da/_ideia/notfit/804-9router-migration.md b/docs/i18n/da/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 3ee5c5f76b..0000000000 --- a/docs/i18n/da/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/da/_ideia/notfit/833-termux-android-support.md b/docs/i18n/da/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 5a9d279e49..0000000000 --- a/docs/i18n/da/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/da/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/da/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index f9862dd6b5..0000000000 --- a/docs/i18n/da/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/da/_ideia/notfit/945-telegram-integration.md b/docs/i18n/da/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 91862ecf90..0000000000 --- a/docs/i18n/da/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/da/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/da/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 29a78a2c51..0000000000 --- a/docs/i18n/da/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/da/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/da/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index f21252b563..0000000000 --- a/docs/i18n/da/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index c9e62b2a13..0000000000 --- a/docs/i18n/da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/da/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/da/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 333429c0f6..0000000000 --- a/docs/i18n/da/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/da/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/da/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 6b81eb027e..0000000000 --- a/docs/i18n/da/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/da/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/da/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 42e7c2b9ca..0000000000 --- a/docs/i18n/da/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index e9464bba1e..0000000000 --- a/docs/i18n/da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/da/src/lib/a2a/README.md b/docs/i18n/da/src/lib/a2a/README.md deleted file mode 100644 index 385e137d9e..0000000000 --- a/docs/i18n/da/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Dansk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arkitektur - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Kom hurtigt i gang - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licens - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/de/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/de/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index b830b61515..0000000000 --- a/docs/i18n/de/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/de/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/de/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 95530a3904..0000000000 --- a/docs/i18n/de/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index e8f7e69851..0000000000 --- a/docs/i18n/de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/de/_ideia/defer/1182-tps-metric.md b/docs/i18n/de/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index b657cb5836..0000000000 --- a/docs/i18n/de/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index aed2383ad8..0000000000 --- a/docs/i18n/de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index f73086619d..0000000000 --- a/docs/i18n/de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/de/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/de/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index cbc91ed0a3..0000000000 --- a/docs/i18n/de/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/de/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/de/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 450f940128..0000000000 --- a/docs/i18n/de/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/de/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/de/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index f6ce2b47e5..0000000000 --- a/docs/i18n/de/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/de/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/de/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 5d46630cd4..0000000000 --- a/docs/i18n/de/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/de/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/de/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index abe0b89617..0000000000 --- a/docs/i18n/de/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/de/_ideia/defer/785-task-class-routing.md b/docs/i18n/de/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 625020eb88..0000000000 --- a/docs/i18n/de/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/de/_ideia/defer/787-auto-research.md b/docs/i18n/de/_ideia/defer/787-auto-research.md deleted file mode 100644 index d2f83fc032..0000000000 --- a/docs/i18n/de/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/de/_ideia/defer/792-team-of-rivals.md b/docs/i18n/de/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 30d8b1402e..0000000000 --- a/docs/i18n/de/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/de/_ideia/defer/797-hierarchical-router.md b/docs/i18n/de/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 50ed42b3b6..0000000000 --- a/docs/i18n/de/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/de/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/de/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index a6888d7e64..0000000000 --- a/docs/i18n/de/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/de/_ideia/defer/980-lkgp-routing.md b/docs/i18n/de/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index efcbb3939c..0000000000 --- a/docs/i18n/de/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/de/_ideia/notfit/1023-providers-independent.md b/docs/i18n/de/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 6bee4eebaf..0000000000 --- a/docs/i18n/de/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/de/_ideia/notfit/1046-native-playground.md b/docs/i18n/de/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 001a1a66b7..0000000000 --- a/docs/i18n/de/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/de/_ideia/notfit/1100-headroom-support.md b/docs/i18n/de/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 15e6676c08..0000000000 --- a/docs/i18n/de/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/de/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/de/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index a33f6c2b39..0000000000 --- a/docs/i18n/de/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/de/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/de/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index e76c2789d6..0000000000 --- a/docs/i18n/de/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/de/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/de/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 84c6ad593e..0000000000 --- a/docs/i18n/de/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/de/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/de/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 46679982dc..0000000000 --- a/docs/i18n/de/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index c75c498e62..0000000000 --- a/docs/i18n/de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index ec55427b4c..0000000000 --- a/docs/i18n/de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/de/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/de/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 275352a841..0000000000 --- a/docs/i18n/de/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/de/_ideia/notfit/804-9router-migration.md b/docs/i18n/de/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 93c0a01cdc..0000000000 --- a/docs/i18n/de/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/de/_ideia/notfit/833-termux-android-support.md b/docs/i18n/de/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 0904e72b37..0000000000 --- a/docs/i18n/de/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/de/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/de/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 5e4616200c..0000000000 --- a/docs/i18n/de/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/de/_ideia/notfit/945-telegram-integration.md b/docs/i18n/de/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 4c5c872388..0000000000 --- a/docs/i18n/de/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/de/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/de/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 487369bcac..0000000000 --- a/docs/i18n/de/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/de/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/de/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index a0836fb01d..0000000000 --- a/docs/i18n/de/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 0002557840..0000000000 --- a/docs/i18n/de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/de/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/de/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index c197cf101a..0000000000 --- a/docs/i18n/de/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/de/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/de/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index aa2b0c9841..0000000000 --- a/docs/i18n/de/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/de/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/de/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index c25e5ed944..0000000000 --- a/docs/i18n/de/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 4510c12913..0000000000 --- a/docs/i18n/de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/de/src/lib/a2a/README.md b/docs/i18n/de/src/lib/a2a/README.md deleted file mode 100644 index d6e4a40d40..0000000000 --- a/docs/i18n/de/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Deutsch) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architektur - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Schnellstart - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lizenz - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/es/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/es/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 9536553df1..0000000000 --- a/docs/i18n/es/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/es/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/es/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 4d2b9b3662..0000000000 --- a/docs/i18n/es/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 5470b293bd..0000000000 --- a/docs/i18n/es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/es/_ideia/defer/1182-tps-metric.md b/docs/i18n/es/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 718b82d359..0000000000 --- a/docs/i18n/es/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 16d5be91a8..0000000000 --- a/docs/i18n/es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 7d0e3307a3..0000000000 --- a/docs/i18n/es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/es/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/es/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 6371e6ea96..0000000000 --- a/docs/i18n/es/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/es/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/es/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 2f13d98d53..0000000000 --- a/docs/i18n/es/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/es/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/es/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 789fe3268f..0000000000 --- a/docs/i18n/es/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/es/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/es/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 340498c473..0000000000 --- a/docs/i18n/es/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/es/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/es/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 8800a8c377..0000000000 --- a/docs/i18n/es/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/es/_ideia/defer/785-task-class-routing.md b/docs/i18n/es/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index b3a7d6b03e..0000000000 --- a/docs/i18n/es/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/es/_ideia/defer/787-auto-research.md b/docs/i18n/es/_ideia/defer/787-auto-research.md deleted file mode 100644 index c56f4bda1d..0000000000 --- a/docs/i18n/es/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/es/_ideia/defer/792-team-of-rivals.md b/docs/i18n/es/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index adbbde228e..0000000000 --- a/docs/i18n/es/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/es/_ideia/defer/797-hierarchical-router.md b/docs/i18n/es/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index a940c55f8d..0000000000 --- a/docs/i18n/es/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/es/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/es/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 21524e4af8..0000000000 --- a/docs/i18n/es/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/es/_ideia/defer/980-lkgp-routing.md b/docs/i18n/es/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 8a00aa5d0c..0000000000 --- a/docs/i18n/es/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/es/_ideia/notfit/1023-providers-independent.md b/docs/i18n/es/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 3114dc2165..0000000000 --- a/docs/i18n/es/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/es/_ideia/notfit/1046-native-playground.md b/docs/i18n/es/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index c5d483b63c..0000000000 --- a/docs/i18n/es/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/es/_ideia/notfit/1100-headroom-support.md b/docs/i18n/es/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 9fd20b9f1c..0000000000 --- a/docs/i18n/es/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/es/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/es/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index c50a85b818..0000000000 --- a/docs/i18n/es/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/es/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/es/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 1351dce18c..0000000000 --- a/docs/i18n/es/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/es/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/es/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 7c47b40188..0000000000 --- a/docs/i18n/es/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/es/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/es/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 301ff37e2c..0000000000 --- a/docs/i18n/es/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 2d7d5b6b21..0000000000 --- a/docs/i18n/es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 6b1e845555..0000000000 --- a/docs/i18n/es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/es/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/es/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index a9026766f5..0000000000 --- a/docs/i18n/es/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/es/_ideia/notfit/804-9router-migration.md b/docs/i18n/es/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index e563b5ca89..0000000000 --- a/docs/i18n/es/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/es/_ideia/notfit/833-termux-android-support.md b/docs/i18n/es/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index c7b3175b26..0000000000 --- a/docs/i18n/es/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/es/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/es/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 4fdd5dadcf..0000000000 --- a/docs/i18n/es/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/es/_ideia/notfit/945-telegram-integration.md b/docs/i18n/es/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index dc817e4d6d..0000000000 --- a/docs/i18n/es/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/es/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/es/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index ad66f15a38..0000000000 --- a/docs/i18n/es/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/es/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/es/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 6a990e16c7..0000000000 --- a/docs/i18n/es/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 8413e1a59b..0000000000 --- a/docs/i18n/es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/es/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/es/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 571e8d87f3..0000000000 --- a/docs/i18n/es/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/es/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/es/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 71fa79fbb1..0000000000 --- a/docs/i18n/es/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/es/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/es/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index beb3043f17..0000000000 --- a/docs/i18n/es/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index a8fab5b81d..0000000000 --- a/docs/i18n/es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/es/src/lib/a2a/README.md b/docs/i18n/es/src/lib/a2a/README.md deleted file mode 100644 index b0520f2ddb..0000000000 --- a/docs/i18n/es/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Español) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arquitectura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Inicio Rápido - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licencia - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/fi/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/fi/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 25c16ee816..0000000000 --- a/docs/i18n/fi/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/fi/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/fi/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index c1ca1dc988..0000000000 --- a/docs/i18n/fi/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index e807103093..0000000000 --- a/docs/i18n/fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fi/_ideia/defer/1182-tps-metric.md b/docs/i18n/fi/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 23d4b1fe0b..0000000000 --- a/docs/i18n/fi/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 903b245f58..0000000000 --- a/docs/i18n/fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index c257a2db66..0000000000 --- a/docs/i18n/fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fi/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/fi/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 641dcb1252..0000000000 --- a/docs/i18n/fi/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/fi/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/fi/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 209dbad6e5..0000000000 --- a/docs/i18n/fi/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/fi/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/fi/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index a8f0d0d4db..0000000000 --- a/docs/i18n/fi/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/fi/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/fi/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index c20bf7f393..0000000000 --- a/docs/i18n/fi/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/fi/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/fi/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 0a37767f8b..0000000000 --- a/docs/i18n/fi/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/fi/_ideia/defer/785-task-class-routing.md b/docs/i18n/fi/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 79f070be52..0000000000 --- a/docs/i18n/fi/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/fi/_ideia/defer/787-auto-research.md b/docs/i18n/fi/_ideia/defer/787-auto-research.md deleted file mode 100644 index 9c212ce0de..0000000000 --- a/docs/i18n/fi/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/fi/_ideia/defer/792-team-of-rivals.md b/docs/i18n/fi/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index c5219a74d6..0000000000 --- a/docs/i18n/fi/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/fi/_ideia/defer/797-hierarchical-router.md b/docs/i18n/fi/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index e70c3b006b..0000000000 --- a/docs/i18n/fi/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/fi/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/fi/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index c0dac3539b..0000000000 --- a/docs/i18n/fi/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/fi/_ideia/defer/980-lkgp-routing.md b/docs/i18n/fi/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 74badc7c8e..0000000000 --- a/docs/i18n/fi/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/fi/_ideia/notfit/1023-providers-independent.md b/docs/i18n/fi/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index e0153f0cb0..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/fi/_ideia/notfit/1046-native-playground.md b/docs/i18n/fi/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 90ee3006bd..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/fi/_ideia/notfit/1100-headroom-support.md b/docs/i18n/fi/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index ccb33d0fa5..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/fi/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/fi/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index f0b5839fd8..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/fi/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/fi/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 98dbf4e459..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/fi/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/fi/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 827e90a690..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/fi/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/fi/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 0d2a17e6d7..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 420ddaed64..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 40ace25f3c..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fi/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/fi/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index a77a95a773..0000000000 --- a/docs/i18n/fi/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/fi/_ideia/notfit/804-9router-migration.md b/docs/i18n/fi/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 845f9bff90..0000000000 --- a/docs/i18n/fi/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/fi/_ideia/notfit/833-termux-android-support.md b/docs/i18n/fi/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 626260b1d6..0000000000 --- a/docs/i18n/fi/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/fi/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/fi/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 9388af72b2..0000000000 --- a/docs/i18n/fi/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/fi/_ideia/notfit/945-telegram-integration.md b/docs/i18n/fi/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index c1e20afb4e..0000000000 --- a/docs/i18n/fi/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/fi/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/fi/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index f2c800eccb..0000000000 --- a/docs/i18n/fi/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/fi/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/fi/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 5956a9f9f8..0000000000 --- a/docs/i18n/fi/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 8a064dae23..0000000000 --- a/docs/i18n/fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/fi/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/fi/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 50e414322b..0000000000 --- a/docs/i18n/fi/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/fi/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/fi/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 931d33f2be..0000000000 --- a/docs/i18n/fi/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/fi/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/fi/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index f7e782df33..0000000000 --- a/docs/i18n/fi/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index f1e668feaf..0000000000 --- a/docs/i18n/fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/fi/src/lib/a2a/README.md b/docs/i18n/fi/src/lib/a2a/README.md deleted file mode 100644 index c8ab4dd02a..0000000000 --- a/docs/i18n/fi/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Suomi) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arkkitehtuuri - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Pikakäynnistys - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lisenssi - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/fr/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/fr/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index ea87088fbe..0000000000 --- a/docs/i18n/fr/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/fr/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/fr/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 655f91635c..0000000000 --- a/docs/i18n/fr/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index d5e91dc302..0000000000 --- a/docs/i18n/fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fr/_ideia/defer/1182-tps-metric.md b/docs/i18n/fr/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 09560440db..0000000000 --- a/docs/i18n/fr/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index b9a6797720..0000000000 --- a/docs/i18n/fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 886613dec4..0000000000 --- a/docs/i18n/fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fr/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/fr/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index b1f2940db2..0000000000 --- a/docs/i18n/fr/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/fr/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/fr/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 2a2b219d28..0000000000 --- a/docs/i18n/fr/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/fr/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/fr/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index fbf8ce0d5f..0000000000 --- a/docs/i18n/fr/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/fr/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/fr/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 066d73c523..0000000000 --- a/docs/i18n/fr/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/fr/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/fr/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index c90a80594b..0000000000 --- a/docs/i18n/fr/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/fr/_ideia/defer/785-task-class-routing.md b/docs/i18n/fr/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 9679bf21ac..0000000000 --- a/docs/i18n/fr/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/fr/_ideia/defer/787-auto-research.md b/docs/i18n/fr/_ideia/defer/787-auto-research.md deleted file mode 100644 index 788e9023bf..0000000000 --- a/docs/i18n/fr/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/fr/_ideia/defer/792-team-of-rivals.md b/docs/i18n/fr/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index f865a88aa5..0000000000 --- a/docs/i18n/fr/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/fr/_ideia/defer/797-hierarchical-router.md b/docs/i18n/fr/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 5a4d001341..0000000000 --- a/docs/i18n/fr/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/fr/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/fr/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 407c6844c6..0000000000 --- a/docs/i18n/fr/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/fr/_ideia/defer/980-lkgp-routing.md b/docs/i18n/fr/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 21aeb906eb..0000000000 --- a/docs/i18n/fr/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/fr/_ideia/notfit/1023-providers-independent.md b/docs/i18n/fr/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 3fea715e30..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/fr/_ideia/notfit/1046-native-playground.md b/docs/i18n/fr/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 29451e43f1..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/fr/_ideia/notfit/1100-headroom-support.md b/docs/i18n/fr/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 85ef4aa2e6..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/fr/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/fr/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 62ab0d5fb3..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/fr/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/fr/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 7ac2c1e54c..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/fr/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/fr/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 738f20d000..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/fr/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/fr/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 5cf7cb15d2..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 54ce2a227c..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index f1797666bf..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/fr/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/fr/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 3ce09a76fc..0000000000 --- a/docs/i18n/fr/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/fr/_ideia/notfit/804-9router-migration.md b/docs/i18n/fr/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 95f6358eb9..0000000000 --- a/docs/i18n/fr/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/fr/_ideia/notfit/833-termux-android-support.md b/docs/i18n/fr/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 4a23375d3b..0000000000 --- a/docs/i18n/fr/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/fr/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/fr/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index bcc1913bcc..0000000000 --- a/docs/i18n/fr/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/fr/_ideia/notfit/945-telegram-integration.md b/docs/i18n/fr/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index e577076fc5..0000000000 --- a/docs/i18n/fr/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/fr/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/fr/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index cb4f91008d..0000000000 --- a/docs/i18n/fr/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/fr/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/fr/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 1f65931376..0000000000 --- a/docs/i18n/fr/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 27896d136e..0000000000 --- a/docs/i18n/fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/fr/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/fr/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 259fcccc89..0000000000 --- a/docs/i18n/fr/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/fr/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/fr/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 5650a7e418..0000000000 --- a/docs/i18n/fr/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/fr/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/fr/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 5eb8d5ca75..0000000000 --- a/docs/i18n/fr/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index beade9f44b..0000000000 --- a/docs/i18n/fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/fr/src/lib/a2a/README.md b/docs/i18n/fr/src/lib/a2a/README.md deleted file mode 100644 index 32ea61f008..0000000000 --- a/docs/i18n/fr/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Français) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architecture - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Démarrage Rapide - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licence - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/he/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/he/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 47870e6e73..0000000000 --- a/docs/i18n/he/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/he/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/he/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index b1835283b7..0000000000 --- a/docs/i18n/he/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 42d4c924fc..0000000000 --- a/docs/i18n/he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/he/_ideia/defer/1182-tps-metric.md b/docs/i18n/he/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 4547e6c340..0000000000 --- a/docs/i18n/he/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index d73d10109d..0000000000 --- a/docs/i18n/he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index affb12ef00..0000000000 --- a/docs/i18n/he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/he/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/he/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 654795a112..0000000000 --- a/docs/i18n/he/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/he/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/he/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 6e5755ba3c..0000000000 --- a/docs/i18n/he/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/he/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/he/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index e44876b100..0000000000 --- a/docs/i18n/he/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/he/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/he/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index f313805a64..0000000000 --- a/docs/i18n/he/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/he/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/he/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 2b62ad7d33..0000000000 --- a/docs/i18n/he/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/he/_ideia/defer/785-task-class-routing.md b/docs/i18n/he/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index abd7f16eac..0000000000 --- a/docs/i18n/he/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/he/_ideia/defer/787-auto-research.md b/docs/i18n/he/_ideia/defer/787-auto-research.md deleted file mode 100644 index d796dbde0e..0000000000 --- a/docs/i18n/he/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/he/_ideia/defer/792-team-of-rivals.md b/docs/i18n/he/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 2a05551ec6..0000000000 --- a/docs/i18n/he/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/he/_ideia/defer/797-hierarchical-router.md b/docs/i18n/he/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index f08781f7a4..0000000000 --- a/docs/i18n/he/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/he/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/he/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 16452540b3..0000000000 --- a/docs/i18n/he/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/he/_ideia/defer/980-lkgp-routing.md b/docs/i18n/he/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index ea0749d484..0000000000 --- a/docs/i18n/he/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/he/_ideia/notfit/1023-providers-independent.md b/docs/i18n/he/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 49238f6d85..0000000000 --- a/docs/i18n/he/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/he/_ideia/notfit/1046-native-playground.md b/docs/i18n/he/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index e1d4764332..0000000000 --- a/docs/i18n/he/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/he/_ideia/notfit/1100-headroom-support.md b/docs/i18n/he/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index b8fe55c093..0000000000 --- a/docs/i18n/he/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/he/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/he/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 73a8660b70..0000000000 --- a/docs/i18n/he/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/he/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/he/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 9177068b6f..0000000000 --- a/docs/i18n/he/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/he/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/he/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 1a29b386cb..0000000000 --- a/docs/i18n/he/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/he/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/he/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 2161b0119d..0000000000 --- a/docs/i18n/he/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 0f9abacedb..0000000000 --- a/docs/i18n/he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index bc9d08b9a7..0000000000 --- a/docs/i18n/he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/he/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/he/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 19cf73bdd0..0000000000 --- a/docs/i18n/he/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/he/_ideia/notfit/804-9router-migration.md b/docs/i18n/he/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index e1e53047e6..0000000000 --- a/docs/i18n/he/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/he/_ideia/notfit/833-termux-android-support.md b/docs/i18n/he/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index ff2cb0a40c..0000000000 --- a/docs/i18n/he/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/he/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/he/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 18de4abf4b..0000000000 --- a/docs/i18n/he/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/he/_ideia/notfit/945-telegram-integration.md b/docs/i18n/he/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 74806f7081..0000000000 --- a/docs/i18n/he/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/he/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/he/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 6704b35a00..0000000000 --- a/docs/i18n/he/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/he/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/he/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 983225df46..0000000000 --- a/docs/i18n/he/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index a35c15928b..0000000000 --- a/docs/i18n/he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/he/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/he/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index cb2ee36500..0000000000 --- a/docs/i18n/he/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/he/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/he/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index c4e90f3d46..0000000000 --- a/docs/i18n/he/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/he/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/he/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index c6a6162f35..0000000000 --- a/docs/i18n/he/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index b94cbebefc..0000000000 --- a/docs/i18n/he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/he/src/lib/a2a/README.md b/docs/i18n/he/src/lib/a2a/README.md deleted file mode 100644 index ca3a48f947..0000000000 --- a/docs/i18n/he/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (עברית) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## ארכיטקטורה - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## התחלה מהירה - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## רישיון - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/hi/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/hi/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 79c13e11b0..0000000000 --- a/docs/i18n/hi/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/hi/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/hi/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 771bbc72ee..0000000000 --- a/docs/i18n/hi/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index ec27252ddc..0000000000 --- a/docs/i18n/hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hi/_ideia/defer/1182-tps-metric.md b/docs/i18n/hi/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 14b6b1fdc0..0000000000 --- a/docs/i18n/hi/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index f73e51537e..0000000000 --- a/docs/i18n/hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 47008610a5..0000000000 --- a/docs/i18n/hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hi/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/hi/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index feb8deb538..0000000000 --- a/docs/i18n/hi/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/hi/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/hi/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 90af6087c1..0000000000 --- a/docs/i18n/hi/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/hi/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/hi/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index d16fbd9a0c..0000000000 --- a/docs/i18n/hi/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/hi/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/hi/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index fe3d6e0dc4..0000000000 --- a/docs/i18n/hi/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/hi/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/hi/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index eab878064d..0000000000 --- a/docs/i18n/hi/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/hi/_ideia/defer/785-task-class-routing.md b/docs/i18n/hi/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index c9994b3628..0000000000 --- a/docs/i18n/hi/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/hi/_ideia/defer/787-auto-research.md b/docs/i18n/hi/_ideia/defer/787-auto-research.md deleted file mode 100644 index c9aa19f601..0000000000 --- a/docs/i18n/hi/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/hi/_ideia/defer/792-team-of-rivals.md b/docs/i18n/hi/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 57a1efee52..0000000000 --- a/docs/i18n/hi/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/hi/_ideia/defer/797-hierarchical-router.md b/docs/i18n/hi/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 2fde29ef49..0000000000 --- a/docs/i18n/hi/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/hi/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/hi/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 6e555ec0c8..0000000000 --- a/docs/i18n/hi/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/hi/_ideia/defer/980-lkgp-routing.md b/docs/i18n/hi/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index bb130c4954..0000000000 --- a/docs/i18n/hi/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/hi/_ideia/notfit/1023-providers-independent.md b/docs/i18n/hi/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 192c23ca38..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/hi/_ideia/notfit/1046-native-playground.md b/docs/i18n/hi/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 67f811a148..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/hi/_ideia/notfit/1100-headroom-support.md b/docs/i18n/hi/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index c7c6167865..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/hi/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/hi/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 019ac280a0..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/hi/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/hi/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index c2f4e3cbc5..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/hi/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/hi/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 82c0cfd8de..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/hi/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/hi/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 0e1470cb3d..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 088804dfcc..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 677adb53b4..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hi/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/hi/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index e0b225b3bc..0000000000 --- a/docs/i18n/hi/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/hi/_ideia/notfit/804-9router-migration.md b/docs/i18n/hi/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 1867ec5bc5..0000000000 --- a/docs/i18n/hi/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/hi/_ideia/notfit/833-termux-android-support.md b/docs/i18n/hi/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 01e0973f12..0000000000 --- a/docs/i18n/hi/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/hi/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/hi/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index e444f03815..0000000000 --- a/docs/i18n/hi/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/hi/_ideia/notfit/945-telegram-integration.md b/docs/i18n/hi/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 8d4f10ea23..0000000000 --- a/docs/i18n/hi/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/hi/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/hi/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 076620fa25..0000000000 --- a/docs/i18n/hi/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/hi/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/hi/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 847c4ff39b..0000000000 --- a/docs/i18n/hi/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index f0129c7661..0000000000 --- a/docs/i18n/hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/hi/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/hi/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index f2e74d45b5..0000000000 --- a/docs/i18n/hi/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/hi/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/hi/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index cd82fcd6ea..0000000000 --- a/docs/i18n/hi/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/hi/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/hi/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 4f341d6a55..0000000000 --- a/docs/i18n/hi/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 1d2a12edd0..0000000000 --- a/docs/i18n/hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/hi/src/lib/a2a/README.md b/docs/i18n/hi/src/lib/a2a/README.md deleted file mode 100644 index 30db8fd88d..0000000000 --- a/docs/i18n/hi/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (हिन्दी) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## आर्किटेक्चर - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## त्वरित प्रारंभ - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## लाइसेंस - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/hu/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/hu/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 186c728674..0000000000 --- a/docs/i18n/hu/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/hu/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/hu/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index a67ff23b6a..0000000000 --- a/docs/i18n/hu/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index cecfdd06e4..0000000000 --- a/docs/i18n/hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hu/_ideia/defer/1182-tps-metric.md b/docs/i18n/hu/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 4d5bf1cd56..0000000000 --- a/docs/i18n/hu/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index a03bf7fb03..0000000000 --- a/docs/i18n/hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index d9148bfeb4..0000000000 --- a/docs/i18n/hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hu/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/hu/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 7a3a237e42..0000000000 --- a/docs/i18n/hu/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/hu/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/hu/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 7eabf81aec..0000000000 --- a/docs/i18n/hu/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/hu/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/hu/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 7ac888b623..0000000000 --- a/docs/i18n/hu/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/hu/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/hu/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 44c21841c7..0000000000 --- a/docs/i18n/hu/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/hu/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/hu/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index cb6f8e827f..0000000000 --- a/docs/i18n/hu/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/hu/_ideia/defer/785-task-class-routing.md b/docs/i18n/hu/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 51b65fec93..0000000000 --- a/docs/i18n/hu/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/hu/_ideia/defer/787-auto-research.md b/docs/i18n/hu/_ideia/defer/787-auto-research.md deleted file mode 100644 index ece17621e8..0000000000 --- a/docs/i18n/hu/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/hu/_ideia/defer/792-team-of-rivals.md b/docs/i18n/hu/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 3582d59d42..0000000000 --- a/docs/i18n/hu/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/hu/_ideia/defer/797-hierarchical-router.md b/docs/i18n/hu/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index d9c9832fc1..0000000000 --- a/docs/i18n/hu/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/hu/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/hu/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index a8b8065768..0000000000 --- a/docs/i18n/hu/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/hu/_ideia/defer/980-lkgp-routing.md b/docs/i18n/hu/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 84472edc90..0000000000 --- a/docs/i18n/hu/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/hu/_ideia/notfit/1023-providers-independent.md b/docs/i18n/hu/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 5cd5b84b23..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/hu/_ideia/notfit/1046-native-playground.md b/docs/i18n/hu/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 50da0726ee..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/hu/_ideia/notfit/1100-headroom-support.md b/docs/i18n/hu/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index fee36fe11e..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/hu/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/hu/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 67c206b3ac..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/hu/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/hu/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index ee4b091dae..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/hu/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/hu/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 53c6e85192..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/hu/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/hu/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 6baef51669..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 4e28dbdfeb..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 3cbe2b4573..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/hu/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/hu/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 005749f213..0000000000 --- a/docs/i18n/hu/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/hu/_ideia/notfit/804-9router-migration.md b/docs/i18n/hu/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 23e0277f82..0000000000 --- a/docs/i18n/hu/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/hu/_ideia/notfit/833-termux-android-support.md b/docs/i18n/hu/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index b187a989ab..0000000000 --- a/docs/i18n/hu/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/hu/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/hu/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 5e8edb5619..0000000000 --- a/docs/i18n/hu/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/hu/_ideia/notfit/945-telegram-integration.md b/docs/i18n/hu/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 2a69f4f81e..0000000000 --- a/docs/i18n/hu/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/hu/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/hu/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 984526e750..0000000000 --- a/docs/i18n/hu/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/hu/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/hu/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 9ab537266a..0000000000 --- a/docs/i18n/hu/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 68042c451c..0000000000 --- a/docs/i18n/hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/hu/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/hu/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 984ab86d62..0000000000 --- a/docs/i18n/hu/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/hu/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/hu/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index e3b2b74814..0000000000 --- a/docs/i18n/hu/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/hu/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/hu/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index a57cd173fa..0000000000 --- a/docs/i18n/hu/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index c5c7d2cd07..0000000000 --- a/docs/i18n/hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/hu/src/lib/a2a/README.md b/docs/i18n/hu/src/lib/a2a/README.md deleted file mode 100644 index afa1ca9bce..0000000000 --- a/docs/i18n/hu/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Magyar) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architektúra - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Gyors kezdés - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licenc - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/id/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/id/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index ac2645bea1..0000000000 --- a/docs/i18n/id/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/id/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/id/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 634e2b7537..0000000000 --- a/docs/i18n/id/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 3f01dc09f8..0000000000 --- a/docs/i18n/id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/id/_ideia/defer/1182-tps-metric.md b/docs/i18n/id/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index fda6ec9cb7..0000000000 --- a/docs/i18n/id/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 556e741993..0000000000 --- a/docs/i18n/id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 48668e06d7..0000000000 --- a/docs/i18n/id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/id/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/id/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index e4cffc5553..0000000000 --- a/docs/i18n/id/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/id/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/id/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 9f2c89f703..0000000000 --- a/docs/i18n/id/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/id/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/id/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 6125b84fd9..0000000000 --- a/docs/i18n/id/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/id/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/id/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 3f8221a7b6..0000000000 --- a/docs/i18n/id/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/id/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/id/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 5d0b8bdb1d..0000000000 --- a/docs/i18n/id/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/id/_ideia/defer/785-task-class-routing.md b/docs/i18n/id/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index c247e51280..0000000000 --- a/docs/i18n/id/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/id/_ideia/defer/787-auto-research.md b/docs/i18n/id/_ideia/defer/787-auto-research.md deleted file mode 100644 index b4cc8614c8..0000000000 --- a/docs/i18n/id/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/id/_ideia/defer/792-team-of-rivals.md b/docs/i18n/id/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index f3c525ec24..0000000000 --- a/docs/i18n/id/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/id/_ideia/defer/797-hierarchical-router.md b/docs/i18n/id/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index aad2f01f86..0000000000 --- a/docs/i18n/id/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/id/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/id/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 47977c6e90..0000000000 --- a/docs/i18n/id/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/id/_ideia/defer/980-lkgp-routing.md b/docs/i18n/id/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 15aca86f91..0000000000 --- a/docs/i18n/id/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/id/_ideia/notfit/1023-providers-independent.md b/docs/i18n/id/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 98387726a4..0000000000 --- a/docs/i18n/id/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/id/_ideia/notfit/1046-native-playground.md b/docs/i18n/id/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 950457a791..0000000000 --- a/docs/i18n/id/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/id/_ideia/notfit/1100-headroom-support.md b/docs/i18n/id/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index da54467fc2..0000000000 --- a/docs/i18n/id/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/id/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/id/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index a433595cd0..0000000000 --- a/docs/i18n/id/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/id/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/id/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 6ccd0a9755..0000000000 --- a/docs/i18n/id/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/id/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/id/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 8dea970829..0000000000 --- a/docs/i18n/id/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/id/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/id/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index b68e767293..0000000000 --- a/docs/i18n/id/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 7ca41a66e5..0000000000 --- a/docs/i18n/id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 709c3b83d2..0000000000 --- a/docs/i18n/id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/id/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/id/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 8d1f91cf3d..0000000000 --- a/docs/i18n/id/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/id/_ideia/notfit/804-9router-migration.md b/docs/i18n/id/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index a8e1874c75..0000000000 --- a/docs/i18n/id/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/id/_ideia/notfit/833-termux-android-support.md b/docs/i18n/id/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index d172e57145..0000000000 --- a/docs/i18n/id/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/id/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/id/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index b4a14ee3cb..0000000000 --- a/docs/i18n/id/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/id/_ideia/notfit/945-telegram-integration.md b/docs/i18n/id/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 702b01f027..0000000000 --- a/docs/i18n/id/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/id/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/id/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 6d640ebb47..0000000000 --- a/docs/i18n/id/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/id/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/id/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 928dad1926..0000000000 --- a/docs/i18n/id/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 81287d1e84..0000000000 --- a/docs/i18n/id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/id/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/id/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index ca268fb93a..0000000000 --- a/docs/i18n/id/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/id/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/id/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index a1a076b55f..0000000000 --- a/docs/i18n/id/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/id/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/id/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 48c7a8ae6a..0000000000 --- a/docs/i18n/id/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index fda62dbd75..0000000000 --- a/docs/i18n/id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/id/src/lib/a2a/README.md b/docs/i18n/id/src/lib/a2a/README.md deleted file mode 100644 index 484bb27b99..0000000000 --- a/docs/i18n/id/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Bahasa Indonesia) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arsitektur - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Mulai Cepat - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lisensi - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/in/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/in/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 4b5c07bb0f..0000000000 --- a/docs/i18n/in/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/in/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/in/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index cb49c18385..0000000000 --- a/docs/i18n/in/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index dc122d72f2..0000000000 --- a/docs/i18n/in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/in/_ideia/defer/1182-tps-metric.md b/docs/i18n/in/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 3a6c171387..0000000000 --- a/docs/i18n/in/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index a1a0a4dac8..0000000000 --- a/docs/i18n/in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 37e1be1a89..0000000000 --- a/docs/i18n/in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/in/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/in/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index a4bdb3519e..0000000000 --- a/docs/i18n/in/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/in/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/in/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index ea757848ec..0000000000 --- a/docs/i18n/in/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/in/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/in/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 748cfce443..0000000000 --- a/docs/i18n/in/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/in/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/in/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 4cae34e489..0000000000 --- a/docs/i18n/in/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/in/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/in/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index c9f7a0c418..0000000000 --- a/docs/i18n/in/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/in/_ideia/defer/785-task-class-routing.md b/docs/i18n/in/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 1e24d9a116..0000000000 --- a/docs/i18n/in/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/in/_ideia/defer/787-auto-research.md b/docs/i18n/in/_ideia/defer/787-auto-research.md deleted file mode 100644 index 939eb3ee27..0000000000 --- a/docs/i18n/in/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/in/_ideia/defer/792-team-of-rivals.md b/docs/i18n/in/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 133fedbe3a..0000000000 --- a/docs/i18n/in/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/in/_ideia/defer/797-hierarchical-router.md b/docs/i18n/in/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index a0263bab07..0000000000 --- a/docs/i18n/in/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/in/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/in/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 5907b9e7f7..0000000000 --- a/docs/i18n/in/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/in/_ideia/defer/980-lkgp-routing.md b/docs/i18n/in/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 0d4f645a21..0000000000 --- a/docs/i18n/in/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/in/_ideia/notfit/1023-providers-independent.md b/docs/i18n/in/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index f478eab099..0000000000 --- a/docs/i18n/in/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/in/_ideia/notfit/1046-native-playground.md b/docs/i18n/in/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index ec9abaa456..0000000000 --- a/docs/i18n/in/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/in/_ideia/notfit/1100-headroom-support.md b/docs/i18n/in/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 2270c59ba3..0000000000 --- a/docs/i18n/in/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/in/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/in/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 2e0354a335..0000000000 --- a/docs/i18n/in/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/in/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/in/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index ccff99ea2a..0000000000 --- a/docs/i18n/in/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/in/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/in/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 186cc5305c..0000000000 --- a/docs/i18n/in/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/in/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/in/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index bdaf0b22b6..0000000000 --- a/docs/i18n/in/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 0f1c5fcdba..0000000000 --- a/docs/i18n/in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index ac5354a042..0000000000 --- a/docs/i18n/in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/in/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/in/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index bc689c1af4..0000000000 --- a/docs/i18n/in/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/in/_ideia/notfit/804-9router-migration.md b/docs/i18n/in/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 2b93768771..0000000000 --- a/docs/i18n/in/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/in/_ideia/notfit/833-termux-android-support.md b/docs/i18n/in/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 3168c7d0f7..0000000000 --- a/docs/i18n/in/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/in/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/in/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index f5bc4091ca..0000000000 --- a/docs/i18n/in/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/in/_ideia/notfit/945-telegram-integration.md b/docs/i18n/in/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 74f89866e6..0000000000 --- a/docs/i18n/in/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/in/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/in/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 1d971bf24c..0000000000 --- a/docs/i18n/in/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/in/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/in/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index e0670a9629..0000000000 --- a/docs/i18n/in/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index c4066fddd8..0000000000 --- a/docs/i18n/in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/in/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/in/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index ae4c7697da..0000000000 --- a/docs/i18n/in/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/in/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/in/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 3f327a7d65..0000000000 --- a/docs/i18n/in/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/in/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/in/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 9ae1104123..0000000000 --- a/docs/i18n/in/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 6e3183b94f..0000000000 --- a/docs/i18n/in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/in/src/lib/a2a/README.md b/docs/i18n/in/src/lib/a2a/README.md deleted file mode 100644 index 240da2920a..0000000000 --- a/docs/i18n/in/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (हिन्दी (IN)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## आर्किटेक्चर - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## त्वरित प्रारंभ - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## लाइसेंस - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/it/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/it/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 9cea0a7a30..0000000000 --- a/docs/i18n/it/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/it/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/it/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index d3f1ebd3d5..0000000000 --- a/docs/i18n/it/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 69b1656bd8..0000000000 --- a/docs/i18n/it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/it/_ideia/defer/1182-tps-metric.md b/docs/i18n/it/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 7f15e57976..0000000000 --- a/docs/i18n/it/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 9dbb116e5b..0000000000 --- a/docs/i18n/it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 3755433482..0000000000 --- a/docs/i18n/it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/it/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/it/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 9311980f5f..0000000000 --- a/docs/i18n/it/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/it/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/it/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index c960400cc4..0000000000 --- a/docs/i18n/it/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/it/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/it/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 272204e8db..0000000000 --- a/docs/i18n/it/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/it/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/it/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index b098adc648..0000000000 --- a/docs/i18n/it/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/it/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/it/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index bb93fda501..0000000000 --- a/docs/i18n/it/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/it/_ideia/defer/785-task-class-routing.md b/docs/i18n/it/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 2bab8e58d2..0000000000 --- a/docs/i18n/it/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/it/_ideia/defer/787-auto-research.md b/docs/i18n/it/_ideia/defer/787-auto-research.md deleted file mode 100644 index 9b038206d9..0000000000 --- a/docs/i18n/it/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/it/_ideia/defer/792-team-of-rivals.md b/docs/i18n/it/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 543026cb82..0000000000 --- a/docs/i18n/it/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/it/_ideia/defer/797-hierarchical-router.md b/docs/i18n/it/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 7c81b1cd2a..0000000000 --- a/docs/i18n/it/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/it/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/it/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index a77be0801b..0000000000 --- a/docs/i18n/it/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/it/_ideia/defer/980-lkgp-routing.md b/docs/i18n/it/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 554b288be8..0000000000 --- a/docs/i18n/it/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/it/_ideia/notfit/1023-providers-independent.md b/docs/i18n/it/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 91f3500717..0000000000 --- a/docs/i18n/it/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/it/_ideia/notfit/1046-native-playground.md b/docs/i18n/it/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 0b1f79aa54..0000000000 --- a/docs/i18n/it/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/it/_ideia/notfit/1100-headroom-support.md b/docs/i18n/it/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index bd1b991671..0000000000 --- a/docs/i18n/it/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/it/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/it/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 8ea63cb12d..0000000000 --- a/docs/i18n/it/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/it/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/it/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 4c8c87f62a..0000000000 --- a/docs/i18n/it/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/it/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/it/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index d7705213a1..0000000000 --- a/docs/i18n/it/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/it/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/it/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 86e5f5774e..0000000000 --- a/docs/i18n/it/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 0790029462..0000000000 --- a/docs/i18n/it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 544f50e646..0000000000 --- a/docs/i18n/it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/it/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/it/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 580dbb9e31..0000000000 --- a/docs/i18n/it/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/it/_ideia/notfit/804-9router-migration.md b/docs/i18n/it/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 86ece4bfe3..0000000000 --- a/docs/i18n/it/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/it/_ideia/notfit/833-termux-android-support.md b/docs/i18n/it/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 70e67917d7..0000000000 --- a/docs/i18n/it/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/it/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/it/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 63f8fd2903..0000000000 --- a/docs/i18n/it/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/it/_ideia/notfit/945-telegram-integration.md b/docs/i18n/it/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 24504200b5..0000000000 --- a/docs/i18n/it/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/it/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/it/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 03b27f27a3..0000000000 --- a/docs/i18n/it/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/it/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/it/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index f4c22d2c32..0000000000 --- a/docs/i18n/it/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 15dcd656e4..0000000000 --- a/docs/i18n/it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/it/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/it/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 5ffec5d7e3..0000000000 --- a/docs/i18n/it/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/it/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/it/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index dac42f72f8..0000000000 --- a/docs/i18n/it/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/it/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/it/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 63618f59e2..0000000000 --- a/docs/i18n/it/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 471d6e6283..0000000000 --- a/docs/i18n/it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/it/src/lib/a2a/README.md b/docs/i18n/it/src/lib/a2a/README.md deleted file mode 100644 index 0aa62a8fb2..0000000000 --- a/docs/i18n/it/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Italiano) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architettura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Avvio Rapido - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licenza - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/ja/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/ja/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index a1f4cc9e82..0000000000 --- a/docs/i18n/ja/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/ja/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/ja/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 705015e1b1..0000000000 --- a/docs/i18n/ja/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index f263a4250c..0000000000 --- a/docs/i18n/ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ja/_ideia/defer/1182-tps-metric.md b/docs/i18n/ja/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 9cda9e7b1c..0000000000 --- a/docs/i18n/ja/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 21684635ff..0000000000 --- a/docs/i18n/ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 4df365710b..0000000000 --- a/docs/i18n/ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ja/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/ja/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 670a8e68f4..0000000000 --- a/docs/i18n/ja/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/ja/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/ja/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 7475a3cc86..0000000000 --- a/docs/i18n/ja/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/ja/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/ja/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 3d65c6df7c..0000000000 --- a/docs/i18n/ja/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/ja/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/ja/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 104ef163fb..0000000000 --- a/docs/i18n/ja/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/ja/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/ja/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index ded18a4345..0000000000 --- a/docs/i18n/ja/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/ja/_ideia/defer/785-task-class-routing.md b/docs/i18n/ja/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index fc355ed190..0000000000 --- a/docs/i18n/ja/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/ja/_ideia/defer/787-auto-research.md b/docs/i18n/ja/_ideia/defer/787-auto-research.md deleted file mode 100644 index 740bdc9582..0000000000 --- a/docs/i18n/ja/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/ja/_ideia/defer/792-team-of-rivals.md b/docs/i18n/ja/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index a90f62b679..0000000000 --- a/docs/i18n/ja/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ja/_ideia/defer/797-hierarchical-router.md b/docs/i18n/ja/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 201b1fce27..0000000000 --- a/docs/i18n/ja/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ja/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/ja/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 0c50fe8e6b..0000000000 --- a/docs/i18n/ja/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/ja/_ideia/defer/980-lkgp-routing.md b/docs/i18n/ja/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index ef5086d651..0000000000 --- a/docs/i18n/ja/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/ja/_ideia/notfit/1023-providers-independent.md b/docs/i18n/ja/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 1d6f564a26..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/ja/_ideia/notfit/1046-native-playground.md b/docs/i18n/ja/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 7a3bded0c4..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/ja/_ideia/notfit/1100-headroom-support.md b/docs/i18n/ja/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index c937ade178..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/ja/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/ja/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 0352fab76b..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/ja/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/ja/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index ba5459ace7..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ja/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/ja/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 8ab7f10cf9..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ja/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/ja/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 4af9f24887..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 552432c5b1..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index a15c086920..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ja/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/ja/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index b7cf44ff30..0000000000 --- a/docs/i18n/ja/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/ja/_ideia/notfit/804-9router-migration.md b/docs/i18n/ja/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 2f19d10e37..0000000000 --- a/docs/i18n/ja/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/ja/_ideia/notfit/833-termux-android-support.md b/docs/i18n/ja/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index ba26d5f1c0..0000000000 --- a/docs/i18n/ja/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/ja/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/ja/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 0a14278959..0000000000 --- a/docs/i18n/ja/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/ja/_ideia/notfit/945-telegram-integration.md b/docs/i18n/ja/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index cc3c0737b4..0000000000 --- a/docs/i18n/ja/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/ja/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/ja/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index f9df1528f2..0000000000 --- a/docs/i18n/ja/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/ja/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/ja/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 0ffbb5e8d0..0000000000 --- a/docs/i18n/ja/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 24d6775bc0..0000000000 --- a/docs/i18n/ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/ja/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/ja/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 16461dabe5..0000000000 --- a/docs/i18n/ja/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ja/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/ja/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index fb18d94080..0000000000 --- a/docs/i18n/ja/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ja/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/ja/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index e5fe853a5b..0000000000 --- a/docs/i18n/ja/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 0c6c4d4b19..0000000000 --- a/docs/i18n/ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/ja/src/lib/a2a/README.md b/docs/i18n/ja/src/lib/a2a/README.md deleted file mode 100644 index bb70b082b5..0000000000 --- a/docs/i18n/ja/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (日本語) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## アーキテクチャ - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## クイックスタート - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## ライセンス - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/ko/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/ko/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index a0b326462f..0000000000 --- a/docs/i18n/ko/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/ko/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/ko/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 918cedd305..0000000000 --- a/docs/i18n/ko/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index fdd5772f2c..0000000000 --- a/docs/i18n/ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ko/_ideia/defer/1182-tps-metric.md b/docs/i18n/ko/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 77e6a5d02b..0000000000 --- a/docs/i18n/ko/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 90d0d1bb2e..0000000000 --- a/docs/i18n/ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index cb319c1da8..0000000000 --- a/docs/i18n/ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ko/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/ko/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 907e33bb79..0000000000 --- a/docs/i18n/ko/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/ko/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/ko/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index e964b24df0..0000000000 --- a/docs/i18n/ko/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/ko/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/ko/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index d07007d92b..0000000000 --- a/docs/i18n/ko/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/ko/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/ko/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 58a224df30..0000000000 --- a/docs/i18n/ko/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/ko/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/ko/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index d119811e38..0000000000 --- a/docs/i18n/ko/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/ko/_ideia/defer/785-task-class-routing.md b/docs/i18n/ko/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 800d3c626c..0000000000 --- a/docs/i18n/ko/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/ko/_ideia/defer/787-auto-research.md b/docs/i18n/ko/_ideia/defer/787-auto-research.md deleted file mode 100644 index 94e96c7c4e..0000000000 --- a/docs/i18n/ko/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/ko/_ideia/defer/792-team-of-rivals.md b/docs/i18n/ko/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 7effe0a676..0000000000 --- a/docs/i18n/ko/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ko/_ideia/defer/797-hierarchical-router.md b/docs/i18n/ko/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 21d5fd22fc..0000000000 --- a/docs/i18n/ko/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ko/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/ko/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index e6c15dbebd..0000000000 --- a/docs/i18n/ko/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/ko/_ideia/defer/980-lkgp-routing.md b/docs/i18n/ko/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 97224f19ca..0000000000 --- a/docs/i18n/ko/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/ko/_ideia/notfit/1023-providers-independent.md b/docs/i18n/ko/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 05635313aa..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/ko/_ideia/notfit/1046-native-playground.md b/docs/i18n/ko/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 18761fedf1..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/ko/_ideia/notfit/1100-headroom-support.md b/docs/i18n/ko/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index e74de88651..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/ko/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/ko/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index ed2237409f..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/ko/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/ko/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index cb806da4b5..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ko/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/ko/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 5de02c3298..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ko/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/ko/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 2425640564..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index fe3bd1061b..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 996bd20e6f..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ko/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/ko/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 26f1427387..0000000000 --- a/docs/i18n/ko/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/ko/_ideia/notfit/804-9router-migration.md b/docs/i18n/ko/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 39c872dbac..0000000000 --- a/docs/i18n/ko/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/ko/_ideia/notfit/833-termux-android-support.md b/docs/i18n/ko/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 0ae76f6710..0000000000 --- a/docs/i18n/ko/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/ko/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/ko/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 091e9cc730..0000000000 --- a/docs/i18n/ko/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/ko/_ideia/notfit/945-telegram-integration.md b/docs/i18n/ko/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 5bdde4ec71..0000000000 --- a/docs/i18n/ko/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/ko/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/ko/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 7cc17b6d45..0000000000 --- a/docs/i18n/ko/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/ko/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/ko/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 42a79cdd75..0000000000 --- a/docs/i18n/ko/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 009f73ca19..0000000000 --- a/docs/i18n/ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/ko/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/ko/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 5d7db790ab..0000000000 --- a/docs/i18n/ko/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ko/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/ko/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 2596f7043b..0000000000 --- a/docs/i18n/ko/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ko/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/ko/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index d107500190..0000000000 --- a/docs/i18n/ko/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index f531ef25d4..0000000000 --- a/docs/i18n/ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/ko/src/lib/a2a/README.md b/docs/i18n/ko/src/lib/a2a/README.md deleted file mode 100644 index b1bfe91417..0000000000 --- a/docs/i18n/ko/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (한국어) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## 아키텍처 - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## 빠른 시작 - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## 라이선스 - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/ms/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/ms/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 000b7949c0..0000000000 --- a/docs/i18n/ms/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/ms/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/ms/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index de810dcb05..0000000000 --- a/docs/i18n/ms/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 292c9099a7..0000000000 --- a/docs/i18n/ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ms/_ideia/defer/1182-tps-metric.md b/docs/i18n/ms/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index a5101a01e5..0000000000 --- a/docs/i18n/ms/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 60c8a4d151..0000000000 --- a/docs/i18n/ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index d203f848b6..0000000000 --- a/docs/i18n/ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ms/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/ms/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index a1ad1d9d8c..0000000000 --- a/docs/i18n/ms/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/ms/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/ms/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 49ee51ddae..0000000000 --- a/docs/i18n/ms/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/ms/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/ms/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index f2af2bfde1..0000000000 --- a/docs/i18n/ms/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/ms/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/ms/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 92b506eb39..0000000000 --- a/docs/i18n/ms/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/ms/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/ms/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 9ce2d92e7f..0000000000 --- a/docs/i18n/ms/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/ms/_ideia/defer/785-task-class-routing.md b/docs/i18n/ms/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 089bacb790..0000000000 --- a/docs/i18n/ms/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/ms/_ideia/defer/787-auto-research.md b/docs/i18n/ms/_ideia/defer/787-auto-research.md deleted file mode 100644 index 877ab59401..0000000000 --- a/docs/i18n/ms/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/ms/_ideia/defer/792-team-of-rivals.md b/docs/i18n/ms/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 1ec956d7fc..0000000000 --- a/docs/i18n/ms/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ms/_ideia/defer/797-hierarchical-router.md b/docs/i18n/ms/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 5842477048..0000000000 --- a/docs/i18n/ms/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ms/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/ms/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 98994952ed..0000000000 --- a/docs/i18n/ms/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/ms/_ideia/defer/980-lkgp-routing.md b/docs/i18n/ms/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 693952da8b..0000000000 --- a/docs/i18n/ms/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/ms/_ideia/notfit/1023-providers-independent.md b/docs/i18n/ms/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 7834f9b516..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/ms/_ideia/notfit/1046-native-playground.md b/docs/i18n/ms/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index c4feb2bb19..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/ms/_ideia/notfit/1100-headroom-support.md b/docs/i18n/ms/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index a56744a86d..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/ms/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/ms/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 5580792337..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/ms/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/ms/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 48f6b5882b..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ms/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/ms/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index e7a9850af3..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ms/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/ms/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index e3d86b48f0..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index efb9b9fc0d..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 49e80d6554..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ms/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/ms/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index afd619e54f..0000000000 --- a/docs/i18n/ms/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/ms/_ideia/notfit/804-9router-migration.md b/docs/i18n/ms/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 91a5da9ca9..0000000000 --- a/docs/i18n/ms/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/ms/_ideia/notfit/833-termux-android-support.md b/docs/i18n/ms/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 78d973ca7c..0000000000 --- a/docs/i18n/ms/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/ms/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/ms/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 4318f2a251..0000000000 --- a/docs/i18n/ms/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/ms/_ideia/notfit/945-telegram-integration.md b/docs/i18n/ms/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index be37c18679..0000000000 --- a/docs/i18n/ms/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/ms/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/ms/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 05e10f17c3..0000000000 --- a/docs/i18n/ms/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/ms/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/ms/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index b828595a71..0000000000 --- a/docs/i18n/ms/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index ed7231a20b..0000000000 --- a/docs/i18n/ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/ms/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/ms/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 8d64f24db8..0000000000 --- a/docs/i18n/ms/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ms/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/ms/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 242fdc4953..0000000000 --- a/docs/i18n/ms/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ms/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/ms/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 70ec75790f..0000000000 --- a/docs/i18n/ms/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 8bb26c4aa2..0000000000 --- a/docs/i18n/ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/ms/src/lib/a2a/README.md b/docs/i18n/ms/src/lib/a2a/README.md deleted file mode 100644 index f416fd9c9d..0000000000 --- a/docs/i18n/ms/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Bahasa Melayu) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Seni Bina - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Mula Pantas - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lesen - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/nl/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/nl/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 99fd405357..0000000000 --- a/docs/i18n/nl/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/nl/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/nl/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 44d63e0dd1..0000000000 --- a/docs/i18n/nl/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 0fc650e5b6..0000000000 --- a/docs/i18n/nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/nl/_ideia/defer/1182-tps-metric.md b/docs/i18n/nl/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index ced125b5e5..0000000000 --- a/docs/i18n/nl/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 3f4144e3c4..0000000000 --- a/docs/i18n/nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 26ec0c7732..0000000000 --- a/docs/i18n/nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/nl/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/nl/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index f52bfc3889..0000000000 --- a/docs/i18n/nl/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/nl/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/nl/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 851d19c157..0000000000 --- a/docs/i18n/nl/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/nl/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/nl/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index dd7a711a1c..0000000000 --- a/docs/i18n/nl/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/nl/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/nl/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 669f3c3344..0000000000 --- a/docs/i18n/nl/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/nl/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/nl/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index a36c8da32e..0000000000 --- a/docs/i18n/nl/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/nl/_ideia/defer/785-task-class-routing.md b/docs/i18n/nl/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 41e7dfdb79..0000000000 --- a/docs/i18n/nl/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/nl/_ideia/defer/787-auto-research.md b/docs/i18n/nl/_ideia/defer/787-auto-research.md deleted file mode 100644 index 877928f775..0000000000 --- a/docs/i18n/nl/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/nl/_ideia/defer/792-team-of-rivals.md b/docs/i18n/nl/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 53b3281b91..0000000000 --- a/docs/i18n/nl/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/nl/_ideia/defer/797-hierarchical-router.md b/docs/i18n/nl/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 8207a72383..0000000000 --- a/docs/i18n/nl/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/nl/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/nl/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index cc85046c5b..0000000000 --- a/docs/i18n/nl/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/nl/_ideia/defer/980-lkgp-routing.md b/docs/i18n/nl/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 9e8e7b6e05..0000000000 --- a/docs/i18n/nl/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/nl/_ideia/notfit/1023-providers-independent.md b/docs/i18n/nl/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index b89b4d18d0..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/nl/_ideia/notfit/1046-native-playground.md b/docs/i18n/nl/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index da25fb83a2..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/nl/_ideia/notfit/1100-headroom-support.md b/docs/i18n/nl/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 66d77a897b..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/nl/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/nl/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index f3137df7a6..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/nl/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/nl/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 88fd42a924..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/nl/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/nl/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 352ccc6664..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/nl/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/nl/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index cd6c914d39..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 258152cdc5..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index bf1b7200df..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/nl/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/nl/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 1c1f9a35c9..0000000000 --- a/docs/i18n/nl/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/nl/_ideia/notfit/804-9router-migration.md b/docs/i18n/nl/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index b6d1da7034..0000000000 --- a/docs/i18n/nl/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/nl/_ideia/notfit/833-termux-android-support.md b/docs/i18n/nl/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 292679cd8b..0000000000 --- a/docs/i18n/nl/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/nl/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/nl/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index c2f5ad50a6..0000000000 --- a/docs/i18n/nl/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/nl/_ideia/notfit/945-telegram-integration.md b/docs/i18n/nl/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index a0a7d62d6c..0000000000 --- a/docs/i18n/nl/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/nl/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/nl/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index a6aa29b145..0000000000 --- a/docs/i18n/nl/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/nl/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/nl/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 5105a38a98..0000000000 --- a/docs/i18n/nl/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 4db73dd461..0000000000 --- a/docs/i18n/nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/nl/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/nl/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 1df034a71f..0000000000 --- a/docs/i18n/nl/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/nl/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/nl/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 49327c30d7..0000000000 --- a/docs/i18n/nl/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/nl/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/nl/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 189ee1b507..0000000000 --- a/docs/i18n/nl/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 166fd70f7f..0000000000 --- a/docs/i18n/nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/nl/src/lib/a2a/README.md b/docs/i18n/nl/src/lib/a2a/README.md deleted file mode 100644 index b11be39b36..0000000000 --- a/docs/i18n/nl/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Nederlands) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architectuur - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Snel starten - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licentie - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/no/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/no/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 9a91f8c3e0..0000000000 --- a/docs/i18n/no/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/no/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/no/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index b9e6a5a5bb..0000000000 --- a/docs/i18n/no/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index e65b4e6b6c..0000000000 --- a/docs/i18n/no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/no/_ideia/defer/1182-tps-metric.md b/docs/i18n/no/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 8a77e96837..0000000000 --- a/docs/i18n/no/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index b56a4dd69b..0000000000 --- a/docs/i18n/no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 6bc1ad09f3..0000000000 --- a/docs/i18n/no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/no/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/no/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 0fd3f57afe..0000000000 --- a/docs/i18n/no/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/no/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/no/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index e72d98f5f5..0000000000 --- a/docs/i18n/no/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/no/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/no/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 59cb91a0fe..0000000000 --- a/docs/i18n/no/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/no/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/no/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index b1e5f001c1..0000000000 --- a/docs/i18n/no/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/no/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/no/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 6bf3d807b7..0000000000 --- a/docs/i18n/no/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/no/_ideia/defer/785-task-class-routing.md b/docs/i18n/no/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 4f14851a34..0000000000 --- a/docs/i18n/no/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/no/_ideia/defer/787-auto-research.md b/docs/i18n/no/_ideia/defer/787-auto-research.md deleted file mode 100644 index b927109ea6..0000000000 --- a/docs/i18n/no/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/no/_ideia/defer/792-team-of-rivals.md b/docs/i18n/no/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 63e0a2d82e..0000000000 --- a/docs/i18n/no/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/no/_ideia/defer/797-hierarchical-router.md b/docs/i18n/no/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 695422e502..0000000000 --- a/docs/i18n/no/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/no/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/no/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 5546a9896b..0000000000 --- a/docs/i18n/no/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/no/_ideia/defer/980-lkgp-routing.md b/docs/i18n/no/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index b211c174be..0000000000 --- a/docs/i18n/no/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/no/_ideia/notfit/1023-providers-independent.md b/docs/i18n/no/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index bde24ef707..0000000000 --- a/docs/i18n/no/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/no/_ideia/notfit/1046-native-playground.md b/docs/i18n/no/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index ff649df98e..0000000000 --- a/docs/i18n/no/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/no/_ideia/notfit/1100-headroom-support.md b/docs/i18n/no/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index db1633a6b4..0000000000 --- a/docs/i18n/no/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/no/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/no/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index d2f14c981b..0000000000 --- a/docs/i18n/no/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/no/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/no/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index b1b4d6ff6b..0000000000 --- a/docs/i18n/no/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/no/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/no/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index e1e5eb99ed..0000000000 --- a/docs/i18n/no/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/no/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/no/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 9be9e3711c..0000000000 --- a/docs/i18n/no/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 84c61a2d8a..0000000000 --- a/docs/i18n/no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index ca32e3d13f..0000000000 --- a/docs/i18n/no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/no/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/no/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 837b4f2eca..0000000000 --- a/docs/i18n/no/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/no/_ideia/notfit/804-9router-migration.md b/docs/i18n/no/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index b0be6f5903..0000000000 --- a/docs/i18n/no/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/no/_ideia/notfit/833-termux-android-support.md b/docs/i18n/no/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 6fc0e769c2..0000000000 --- a/docs/i18n/no/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/no/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/no/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 9da951a9da..0000000000 --- a/docs/i18n/no/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/no/_ideia/notfit/945-telegram-integration.md b/docs/i18n/no/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 0c315fbbe7..0000000000 --- a/docs/i18n/no/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/no/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/no/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index c9ddf90e21..0000000000 --- a/docs/i18n/no/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/no/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/no/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index befff7d355..0000000000 --- a/docs/i18n/no/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 983a755303..0000000000 --- a/docs/i18n/no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/no/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/no/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index d8112e56fe..0000000000 --- a/docs/i18n/no/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/no/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/no/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 929793bded..0000000000 --- a/docs/i18n/no/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/no/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/no/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index f07e7c27fd..0000000000 --- a/docs/i18n/no/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index a369c334da..0000000000 --- a/docs/i18n/no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/no/src/lib/a2a/README.md b/docs/i18n/no/src/lib/a2a/README.md deleted file mode 100644 index c3bfa458f9..0000000000 --- a/docs/i18n/no/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Norsk) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arkitektur - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Hurtigstart - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lisens - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/phi/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/phi/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 2f7706698e..0000000000 --- a/docs/i18n/phi/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/phi/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/phi/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 4f9b49aea3..0000000000 --- a/docs/i18n/phi/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index a3342bfea1..0000000000 --- a/docs/i18n/phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/phi/_ideia/defer/1182-tps-metric.md b/docs/i18n/phi/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index f4136deabe..0000000000 --- a/docs/i18n/phi/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 2abaf67257..0000000000 --- a/docs/i18n/phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 82c2a01f69..0000000000 --- a/docs/i18n/phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/phi/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/phi/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 3fc5279e8a..0000000000 --- a/docs/i18n/phi/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/phi/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/phi/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 183b13ab6e..0000000000 --- a/docs/i18n/phi/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/phi/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/phi/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 93b757103e..0000000000 --- a/docs/i18n/phi/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/phi/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/phi/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 43650c35d1..0000000000 --- a/docs/i18n/phi/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/phi/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/phi/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 03661d7e5b..0000000000 --- a/docs/i18n/phi/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/phi/_ideia/defer/785-task-class-routing.md b/docs/i18n/phi/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 4a339ec44f..0000000000 --- a/docs/i18n/phi/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/phi/_ideia/defer/787-auto-research.md b/docs/i18n/phi/_ideia/defer/787-auto-research.md deleted file mode 100644 index 5a6b6e81aa..0000000000 --- a/docs/i18n/phi/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/phi/_ideia/defer/792-team-of-rivals.md b/docs/i18n/phi/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 91bfd2ad3e..0000000000 --- a/docs/i18n/phi/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/phi/_ideia/defer/797-hierarchical-router.md b/docs/i18n/phi/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 30d77e162f..0000000000 --- a/docs/i18n/phi/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/phi/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/phi/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 81ad41569c..0000000000 --- a/docs/i18n/phi/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/phi/_ideia/defer/980-lkgp-routing.md b/docs/i18n/phi/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 292b021b5f..0000000000 --- a/docs/i18n/phi/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/phi/_ideia/notfit/1023-providers-independent.md b/docs/i18n/phi/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index b87fb4ec29..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/phi/_ideia/notfit/1046-native-playground.md b/docs/i18n/phi/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 70df6de8e6..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/phi/_ideia/notfit/1100-headroom-support.md b/docs/i18n/phi/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index df6706c1a1..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/phi/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/phi/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index beac8d72fb..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/phi/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/phi/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 220495439f..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/phi/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/phi/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 568798379a..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/phi/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/phi/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index f478ead85e..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 340edca08a..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index f1a2007e51..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/phi/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/phi/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index a7cc763a54..0000000000 --- a/docs/i18n/phi/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/phi/_ideia/notfit/804-9router-migration.md b/docs/i18n/phi/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 4031c1647e..0000000000 --- a/docs/i18n/phi/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/phi/_ideia/notfit/833-termux-android-support.md b/docs/i18n/phi/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 0941b317fb..0000000000 --- a/docs/i18n/phi/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/phi/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/phi/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 725aabc0c5..0000000000 --- a/docs/i18n/phi/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/phi/_ideia/notfit/945-telegram-integration.md b/docs/i18n/phi/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index fb19dbdeab..0000000000 --- a/docs/i18n/phi/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/phi/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/phi/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 5310c65829..0000000000 --- a/docs/i18n/phi/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/phi/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/phi/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 0813f9b591..0000000000 --- a/docs/i18n/phi/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 97a1f41c10..0000000000 --- a/docs/i18n/phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/phi/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/phi/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index cff9edb3e1..0000000000 --- a/docs/i18n/phi/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/phi/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/phi/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index ca8a7e2b76..0000000000 --- a/docs/i18n/phi/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/phi/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/phi/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 708b365323..0000000000 --- a/docs/i18n/phi/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index db48cb5c42..0000000000 --- a/docs/i18n/phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/phi/src/lib/a2a/README.md b/docs/i18n/phi/src/lib/a2a/README.md deleted file mode 100644 index b0464b4305..0000000000 --- a/docs/i18n/phi/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Filipino) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arkitektura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Mabilis na Simula - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lisensya - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/pl/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/pl/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index efdcaea04b..0000000000 --- a/docs/i18n/pl/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/pl/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/pl/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index dbc698978e..0000000000 --- a/docs/i18n/pl/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 5634a301c4..0000000000 --- a/docs/i18n/pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pl/_ideia/defer/1182-tps-metric.md b/docs/i18n/pl/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 6105118a8c..0000000000 --- a/docs/i18n/pl/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index dbdadfe38b..0000000000 --- a/docs/i18n/pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index c4644bdcd0..0000000000 --- a/docs/i18n/pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pl/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/pl/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 8cc1c08169..0000000000 --- a/docs/i18n/pl/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/pl/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/pl/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 33a1187723..0000000000 --- a/docs/i18n/pl/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/pl/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/pl/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 9b81160283..0000000000 --- a/docs/i18n/pl/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/pl/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/pl/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 0680a5971f..0000000000 --- a/docs/i18n/pl/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/pl/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/pl/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index db921647ef..0000000000 --- a/docs/i18n/pl/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/pl/_ideia/defer/785-task-class-routing.md b/docs/i18n/pl/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index c4e61f31b6..0000000000 --- a/docs/i18n/pl/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/pl/_ideia/defer/787-auto-research.md b/docs/i18n/pl/_ideia/defer/787-auto-research.md deleted file mode 100644 index b0152b8e8d..0000000000 --- a/docs/i18n/pl/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/pl/_ideia/defer/792-team-of-rivals.md b/docs/i18n/pl/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index b77ac07890..0000000000 --- a/docs/i18n/pl/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/pl/_ideia/defer/797-hierarchical-router.md b/docs/i18n/pl/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 3127f80c70..0000000000 --- a/docs/i18n/pl/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/pl/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/pl/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index e5e5fce269..0000000000 --- a/docs/i18n/pl/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/pl/_ideia/defer/980-lkgp-routing.md b/docs/i18n/pl/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index a80cc2273b..0000000000 --- a/docs/i18n/pl/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/pl/_ideia/notfit/1023-providers-independent.md b/docs/i18n/pl/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 6223d3e029..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/pl/_ideia/notfit/1046-native-playground.md b/docs/i18n/pl/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index ba23645f88..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/pl/_ideia/notfit/1100-headroom-support.md b/docs/i18n/pl/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 42212a2ad7..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/pl/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/pl/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index c1d346eda3..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/pl/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/pl/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 118a5a0672..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/pl/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/pl/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 011e0bf008..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/pl/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/pl/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 166531f911..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index ba2bf76750..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 11e1e7f639..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pl/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/pl/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 72d74add41..0000000000 --- a/docs/i18n/pl/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/pl/_ideia/notfit/804-9router-migration.md b/docs/i18n/pl/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 27db88bcbd..0000000000 --- a/docs/i18n/pl/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/pl/_ideia/notfit/833-termux-android-support.md b/docs/i18n/pl/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index f8922e2500..0000000000 --- a/docs/i18n/pl/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/pl/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/pl/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 7f9636944f..0000000000 --- a/docs/i18n/pl/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/pl/_ideia/notfit/945-telegram-integration.md b/docs/i18n/pl/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 301cc7736f..0000000000 --- a/docs/i18n/pl/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/pl/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/pl/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 2b251ca63b..0000000000 --- a/docs/i18n/pl/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/pl/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/pl/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index ad7badaa9b..0000000000 --- a/docs/i18n/pl/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 30c16032fe..0000000000 --- a/docs/i18n/pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/pl/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/pl/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 20b36b5c28..0000000000 --- a/docs/i18n/pl/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pl/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/pl/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 1d3de99576..0000000000 --- a/docs/i18n/pl/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pl/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/pl/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 0840e58598..0000000000 --- a/docs/i18n/pl/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 9d632f2df3..0000000000 --- a/docs/i18n/pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/pl/src/lib/a2a/README.md b/docs/i18n/pl/src/lib/a2a/README.md deleted file mode 100644 index acedc1f8db..0000000000 --- a/docs/i18n/pl/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Polski) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architektura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Szybki start - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licencja - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/pt-BR/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/pt-BR/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 52b9b00a37..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index fb63f0799f..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index ab0456d6bc..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt-BR/_ideia/defer/1182-tps-metric.md b/docs/i18n/pt-BR/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 4fed4bc52c..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index eb4c49a41f..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 54a5f781f7..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt-BR/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/pt-BR/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 74cc8dd135..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index c5d885f089..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 187a86f7db..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/pt-BR/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/pt-BR/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 81995df9b2..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/pt-BR/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/pt-BR/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index cfe76b60a5..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/pt-BR/_ideia/defer/785-task-class-routing.md b/docs/i18n/pt-BR/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 0ba0b0dc27..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/pt-BR/_ideia/defer/787-auto-research.md b/docs/i18n/pt-BR/_ideia/defer/787-auto-research.md deleted file mode 100644 index 2d7904910c..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/pt-BR/_ideia/defer/792-team-of-rivals.md b/docs/i18n/pt-BR/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 9709058c1e..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/pt-BR/_ideia/defer/797-hierarchical-router.md b/docs/i18n/pt-BR/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index d3542e1da5..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/pt-BR/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/pt-BR/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 28c9cf3518..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/pt-BR/_ideia/defer/980-lkgp-routing.md b/docs/i18n/pt-BR/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 1350c41da4..0000000000 --- a/docs/i18n/pt-BR/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/pt-BR/_ideia/notfit/1023-providers-independent.md b/docs/i18n/pt-BR/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 6d26ae407b..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/pt-BR/_ideia/notfit/1046-native-playground.md b/docs/i18n/pt-BR/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index e124abb653..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/pt-BR/_ideia/notfit/1100-headroom-support.md b/docs/i18n/pt-BR/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index d4e8013ec9..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 9b02418f23..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/pt-BR/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/pt-BR/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 1eb033a28a..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/pt-BR/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/pt-BR/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 21976faa80..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/pt-BR/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/pt-BR/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 63fe88ed10..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index ceb329861b..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 34073c4acc..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index c6e360d211..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/pt-BR/_ideia/notfit/804-9router-migration.md b/docs/i18n/pt-BR/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index e5ded39c88..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/pt-BR/_ideia/notfit/833-termux-android-support.md b/docs/i18n/pt-BR/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 2e7258a71f..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/pt-BR/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/pt-BR/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 58d409ae32..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/pt-BR/_ideia/notfit/945-telegram-integration.md b/docs/i18n/pt-BR/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 2dffeee2ff..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/pt-BR/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/pt-BR/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 7d6aa94214..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/pt-BR/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/pt-BR/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 9c1f229d10..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 3d152f88f4..0000000000 --- a/docs/i18n/pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/pt-BR/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/pt-BR/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index cc7fc392cd..0000000000 --- a/docs/i18n/pt-BR/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pt-BR/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/pt-BR/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 8f1a8d66e8..0000000000 --- a/docs/i18n/pt-BR/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 0d91332f2e..0000000000 --- a/docs/i18n/pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 07290d167c..0000000000 --- a/docs/i18n/pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/pt-BR/src/lib/a2a/README.md b/docs/i18n/pt-BR/src/lib/a2a/README.md deleted file mode 100644 index 45c578dbd7..0000000000 --- a/docs/i18n/pt-BR/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Português (Brasil)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arquitetura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Início Rápido - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licença - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/pt/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/pt/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index ec23f8da71..0000000000 --- a/docs/i18n/pt/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/pt/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/pt/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index ce41aea9e1..0000000000 --- a/docs/i18n/pt/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index df06e8679a..0000000000 --- a/docs/i18n/pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt/_ideia/defer/1182-tps-metric.md b/docs/i18n/pt/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index e758979788..0000000000 --- a/docs/i18n/pt/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 8268b913ed..0000000000 --- a/docs/i18n/pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index e64f7a73d0..0000000000 --- a/docs/i18n/pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/pt/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 63386392ba..0000000000 --- a/docs/i18n/pt/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/pt/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/pt/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 95446a12e9..0000000000 --- a/docs/i18n/pt/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/pt/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/pt/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 3956be6657..0000000000 --- a/docs/i18n/pt/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/pt/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/pt/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index d4f7d827d4..0000000000 --- a/docs/i18n/pt/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/pt/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/pt/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index b0e13cd905..0000000000 --- a/docs/i18n/pt/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/pt/_ideia/defer/785-task-class-routing.md b/docs/i18n/pt/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 099f5f171b..0000000000 --- a/docs/i18n/pt/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/pt/_ideia/defer/787-auto-research.md b/docs/i18n/pt/_ideia/defer/787-auto-research.md deleted file mode 100644 index 67bbf93913..0000000000 --- a/docs/i18n/pt/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/pt/_ideia/defer/792-team-of-rivals.md b/docs/i18n/pt/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index a2d29af205..0000000000 --- a/docs/i18n/pt/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/pt/_ideia/defer/797-hierarchical-router.md b/docs/i18n/pt/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 93dcb29487..0000000000 --- a/docs/i18n/pt/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/pt/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/pt/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 54ebcc8b30..0000000000 --- a/docs/i18n/pt/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/pt/_ideia/defer/980-lkgp-routing.md b/docs/i18n/pt/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 63d0128299..0000000000 --- a/docs/i18n/pt/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/pt/_ideia/notfit/1023-providers-independent.md b/docs/i18n/pt/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 698cc9bea0..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/pt/_ideia/notfit/1046-native-playground.md b/docs/i18n/pt/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index ee7b519b3d..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/pt/_ideia/notfit/1100-headroom-support.md b/docs/i18n/pt/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 5e1d72d06e..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/pt/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/pt/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 41bfebae06..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/pt/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/pt/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 302087d302..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/pt/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/pt/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 640b2ab0ca..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/pt/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/pt/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 45fd1b53bc..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 882d99fe9d..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 0b0c49c933..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/pt/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/pt/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index ae9f03cc26..0000000000 --- a/docs/i18n/pt/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/pt/_ideia/notfit/804-9router-migration.md b/docs/i18n/pt/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 9679bd9955..0000000000 --- a/docs/i18n/pt/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/pt/_ideia/notfit/833-termux-android-support.md b/docs/i18n/pt/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 00f7807b8f..0000000000 --- a/docs/i18n/pt/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/pt/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/pt/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index db16379b88..0000000000 --- a/docs/i18n/pt/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/pt/_ideia/notfit/945-telegram-integration.md b/docs/i18n/pt/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 895557a626..0000000000 --- a/docs/i18n/pt/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/pt/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/pt/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 242367dcdf..0000000000 --- a/docs/i18n/pt/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/pt/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/pt/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 99f291197d..0000000000 --- a/docs/i18n/pt/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index e7b9819add..0000000000 --- a/docs/i18n/pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/pt/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/pt/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index b3ee0d1df5..0000000000 --- a/docs/i18n/pt/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pt/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/pt/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 000690d301..0000000000 --- a/docs/i18n/pt/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pt/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/pt/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 09e0c6e69e..0000000000 --- a/docs/i18n/pt/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 087f1fc072..0000000000 --- a/docs/i18n/pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/pt/src/lib/a2a/README.md b/docs/i18n/pt/src/lib/a2a/README.md deleted file mode 100644 index 7fe6754224..0000000000 --- a/docs/i18n/pt/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Português (Portugal)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arquitetura - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Início Rápido - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licença - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/ro/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/ro/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 3b8f63b2cc..0000000000 --- a/docs/i18n/ro/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/ro/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/ro/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 17fe16b5a4..0000000000 --- a/docs/i18n/ro/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 27fb556a9a..0000000000 --- a/docs/i18n/ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ro/_ideia/defer/1182-tps-metric.md b/docs/i18n/ro/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 1f08756994..0000000000 --- a/docs/i18n/ro/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 4ac607b3b0..0000000000 --- a/docs/i18n/ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 89cff22a66..0000000000 --- a/docs/i18n/ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ro/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/ro/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 011951daa6..0000000000 --- a/docs/i18n/ro/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/ro/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/ro/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index ebbdae25f8..0000000000 --- a/docs/i18n/ro/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/ro/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/ro/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 4cb253f7d9..0000000000 --- a/docs/i18n/ro/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/ro/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/ro/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 54414a1cf3..0000000000 --- a/docs/i18n/ro/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/ro/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/ro/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index f41ffe5a24..0000000000 --- a/docs/i18n/ro/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/ro/_ideia/defer/785-task-class-routing.md b/docs/i18n/ro/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 4295bf19d4..0000000000 --- a/docs/i18n/ro/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/ro/_ideia/defer/787-auto-research.md b/docs/i18n/ro/_ideia/defer/787-auto-research.md deleted file mode 100644 index f06d808922..0000000000 --- a/docs/i18n/ro/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/ro/_ideia/defer/792-team-of-rivals.md b/docs/i18n/ro/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index b6221ca980..0000000000 --- a/docs/i18n/ro/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ro/_ideia/defer/797-hierarchical-router.md b/docs/i18n/ro/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index d73cb007a5..0000000000 --- a/docs/i18n/ro/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ro/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/ro/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 70353fbc6c..0000000000 --- a/docs/i18n/ro/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/ro/_ideia/defer/980-lkgp-routing.md b/docs/i18n/ro/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index b6d17cb352..0000000000 --- a/docs/i18n/ro/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/ro/_ideia/notfit/1023-providers-independent.md b/docs/i18n/ro/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 258eb850bd..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/ro/_ideia/notfit/1046-native-playground.md b/docs/i18n/ro/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index bd9230c353..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/ro/_ideia/notfit/1100-headroom-support.md b/docs/i18n/ro/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 31edb82801..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/ro/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/ro/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index e959363427..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/ro/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/ro/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 8715afe412..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ro/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/ro/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index d06c2218bb..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ro/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/ro/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 1e5db236ed..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index e53542e710..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index da54f437ca..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ro/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/ro/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index ab8ae86324..0000000000 --- a/docs/i18n/ro/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/ro/_ideia/notfit/804-9router-migration.md b/docs/i18n/ro/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 3e308b9f41..0000000000 --- a/docs/i18n/ro/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/ro/_ideia/notfit/833-termux-android-support.md b/docs/i18n/ro/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 450de0dca6..0000000000 --- a/docs/i18n/ro/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/ro/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/ro/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 0d2ba3a90a..0000000000 --- a/docs/i18n/ro/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/ro/_ideia/notfit/945-telegram-integration.md b/docs/i18n/ro/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index da215d1731..0000000000 --- a/docs/i18n/ro/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/ro/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/ro/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index fa7c595e68..0000000000 --- a/docs/i18n/ro/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/ro/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/ro/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index b865f14a7d..0000000000 --- a/docs/i18n/ro/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 3a6066dc36..0000000000 --- a/docs/i18n/ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/ro/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/ro/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index bce75d8f84..0000000000 --- a/docs/i18n/ro/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ro/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/ro/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index f5373fe715..0000000000 --- a/docs/i18n/ro/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ro/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/ro/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 4c74c2beba..0000000000 --- a/docs/i18n/ro/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index f9eae21969..0000000000 --- a/docs/i18n/ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/ro/src/lib/a2a/README.md b/docs/i18n/ro/src/lib/a2a/README.md deleted file mode 100644 index e43450c4b8..0000000000 --- a/docs/i18n/ro/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Română) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arhitectură - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Pornire rapidă - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licență - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/ru/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/ru/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 693fadd715..0000000000 --- a/docs/i18n/ru/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/ru/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/ru/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 9d64df7119..0000000000 --- a/docs/i18n/ru/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 86c79e1731..0000000000 --- a/docs/i18n/ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ru/_ideia/defer/1182-tps-metric.md b/docs/i18n/ru/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 86ab5e2715..0000000000 --- a/docs/i18n/ru/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 32ae1b74e1..0000000000 --- a/docs/i18n/ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 70ec5481d1..0000000000 --- a/docs/i18n/ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ru/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/ru/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 8f3569b82f..0000000000 --- a/docs/i18n/ru/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/ru/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/ru/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index ba2d1c209d..0000000000 --- a/docs/i18n/ru/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/ru/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/ru/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 1a8c80c86a..0000000000 --- a/docs/i18n/ru/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/ru/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/ru/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 7a37de0d8f..0000000000 --- a/docs/i18n/ru/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/ru/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/ru/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index ba04fde7dc..0000000000 --- a/docs/i18n/ru/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/ru/_ideia/defer/785-task-class-routing.md b/docs/i18n/ru/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index a7c672ac31..0000000000 --- a/docs/i18n/ru/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/ru/_ideia/defer/787-auto-research.md b/docs/i18n/ru/_ideia/defer/787-auto-research.md deleted file mode 100644 index c55a7d3fc8..0000000000 --- a/docs/i18n/ru/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/ru/_ideia/defer/792-team-of-rivals.md b/docs/i18n/ru/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 0c15e058a3..0000000000 --- a/docs/i18n/ru/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ru/_ideia/defer/797-hierarchical-router.md b/docs/i18n/ru/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index f05907ccf5..0000000000 --- a/docs/i18n/ru/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/ru/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/ru/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 7a27cbd573..0000000000 --- a/docs/i18n/ru/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/ru/_ideia/defer/980-lkgp-routing.md b/docs/i18n/ru/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 1e137d3ed8..0000000000 --- a/docs/i18n/ru/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/ru/_ideia/notfit/1023-providers-independent.md b/docs/i18n/ru/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 1b6f0c142d..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/ru/_ideia/notfit/1046-native-playground.md b/docs/i18n/ru/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 7510136ddc..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/ru/_ideia/notfit/1100-headroom-support.md b/docs/i18n/ru/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 9caf9329ba..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/ru/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/ru/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 4130212bf6..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/ru/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/ru/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 803abc3f77..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ru/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/ru/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 043716cfd9..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/ru/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/ru/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 5b46be09dd..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 79630c648d..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 3a13b3eafd..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/ru/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/ru/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index d9f688ed13..0000000000 --- a/docs/i18n/ru/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/ru/_ideia/notfit/804-9router-migration.md b/docs/i18n/ru/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 2f6403f9a9..0000000000 --- a/docs/i18n/ru/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/ru/_ideia/notfit/833-termux-android-support.md b/docs/i18n/ru/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 4eff3ec823..0000000000 --- a/docs/i18n/ru/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/ru/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/ru/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 31cc319a71..0000000000 --- a/docs/i18n/ru/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/ru/_ideia/notfit/945-telegram-integration.md b/docs/i18n/ru/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 1e37651c9a..0000000000 --- a/docs/i18n/ru/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/ru/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/ru/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index f048f36ce8..0000000000 --- a/docs/i18n/ru/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/ru/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/ru/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index c4937723c0..0000000000 --- a/docs/i18n/ru/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 4b1e009707..0000000000 --- a/docs/i18n/ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/ru/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/ru/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index b3a7a46bf2..0000000000 --- a/docs/i18n/ru/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ru/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/ru/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index e4aaf5967a..0000000000 --- a/docs/i18n/ru/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ru/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/ru/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index b863a75cff..0000000000 --- a/docs/i18n/ru/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 78231787eb..0000000000 --- a/docs/i18n/ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/ru/src/lib/a2a/README.md b/docs/i18n/ru/src/lib/a2a/README.md deleted file mode 100644 index 6f576b077b..0000000000 --- a/docs/i18n/ru/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Русский) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Архитектура - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Быстрый старт - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Лицензия - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/sk/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/sk/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 37bbb751a2..0000000000 --- a/docs/i18n/sk/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/sk/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/sk/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index a5ea9252fd..0000000000 --- a/docs/i18n/sk/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 69e1270a8b..0000000000 --- a/docs/i18n/sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sk/_ideia/defer/1182-tps-metric.md b/docs/i18n/sk/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index f281456c81..0000000000 --- a/docs/i18n/sk/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 0a2e150347..0000000000 --- a/docs/i18n/sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 82a9222c6d..0000000000 --- a/docs/i18n/sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sk/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/sk/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 2d71a95030..0000000000 --- a/docs/i18n/sk/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/sk/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/sk/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index fc9b8bf1c0..0000000000 --- a/docs/i18n/sk/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/sk/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/sk/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index a646b701ca..0000000000 --- a/docs/i18n/sk/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/sk/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/sk/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index f247e86849..0000000000 --- a/docs/i18n/sk/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/sk/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/sk/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 48bee56cc4..0000000000 --- a/docs/i18n/sk/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/sk/_ideia/defer/785-task-class-routing.md b/docs/i18n/sk/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 1e533b35cf..0000000000 --- a/docs/i18n/sk/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/sk/_ideia/defer/787-auto-research.md b/docs/i18n/sk/_ideia/defer/787-auto-research.md deleted file mode 100644 index cfa69495a4..0000000000 --- a/docs/i18n/sk/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/sk/_ideia/defer/792-team-of-rivals.md b/docs/i18n/sk/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index be7e955917..0000000000 --- a/docs/i18n/sk/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/sk/_ideia/defer/797-hierarchical-router.md b/docs/i18n/sk/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 4a299f7533..0000000000 --- a/docs/i18n/sk/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/sk/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/sk/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 6b36e77148..0000000000 --- a/docs/i18n/sk/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/sk/_ideia/defer/980-lkgp-routing.md b/docs/i18n/sk/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 76adb03b40..0000000000 --- a/docs/i18n/sk/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/sk/_ideia/notfit/1023-providers-independent.md b/docs/i18n/sk/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 894f6be4f5..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/sk/_ideia/notfit/1046-native-playground.md b/docs/i18n/sk/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 7499e0ea41..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/sk/_ideia/notfit/1100-headroom-support.md b/docs/i18n/sk/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 7b1a9dab6e..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/sk/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/sk/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index e7aa6cf412..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/sk/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/sk/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 6acb78f824..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/sk/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/sk/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 854875dfc5..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/sk/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/sk/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index e924a2be13..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index ae96bf998c..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index ee1e49c535..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sk/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/sk/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 8e7c5f7a11..0000000000 --- a/docs/i18n/sk/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/sk/_ideia/notfit/804-9router-migration.md b/docs/i18n/sk/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index d8cd679ce5..0000000000 --- a/docs/i18n/sk/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/sk/_ideia/notfit/833-termux-android-support.md b/docs/i18n/sk/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 98360ea261..0000000000 --- a/docs/i18n/sk/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/sk/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/sk/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index e9541d0b69..0000000000 --- a/docs/i18n/sk/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/sk/_ideia/notfit/945-telegram-integration.md b/docs/i18n/sk/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index fdf15f4fe0..0000000000 --- a/docs/i18n/sk/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/sk/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/sk/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 6199cec2a8..0000000000 --- a/docs/i18n/sk/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/sk/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/sk/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 0092d13fc5..0000000000 --- a/docs/i18n/sk/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 05d9e084cb..0000000000 --- a/docs/i18n/sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/sk/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/sk/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 29fdfc1c07..0000000000 --- a/docs/i18n/sk/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/sk/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/sk/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 2a89ff9b78..0000000000 --- a/docs/i18n/sk/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/sk/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/sk/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 020cf4b7a5..0000000000 --- a/docs/i18n/sk/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 3efb695611..0000000000 --- a/docs/i18n/sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/sk/src/lib/a2a/README.md b/docs/i18n/sk/src/lib/a2a/README.md deleted file mode 100644 index 949d33e288..0000000000 --- a/docs/i18n/sk/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Slovenčina) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Architektúra - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Rýchly štart - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licencia - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/sv/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/sv/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index bd93a23b23..0000000000 --- a/docs/i18n/sv/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/sv/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/sv/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 8137d1b574..0000000000 --- a/docs/i18n/sv/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index c448dac090..0000000000 --- a/docs/i18n/sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sv/_ideia/defer/1182-tps-metric.md b/docs/i18n/sv/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index a538139a58..0000000000 --- a/docs/i18n/sv/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index dfb3796c9b..0000000000 --- a/docs/i18n/sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index b1bc431a43..0000000000 --- a/docs/i18n/sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sv/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/sv/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 4f9d3721ff..0000000000 --- a/docs/i18n/sv/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/sv/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/sv/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 47746c1ac7..0000000000 --- a/docs/i18n/sv/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/sv/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/sv/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index cf1c95fcc0..0000000000 --- a/docs/i18n/sv/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/sv/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/sv/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index e8c1b8325c..0000000000 --- a/docs/i18n/sv/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/sv/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/sv/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 884dd8aa18..0000000000 --- a/docs/i18n/sv/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/sv/_ideia/defer/785-task-class-routing.md b/docs/i18n/sv/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 02e3eab57e..0000000000 --- a/docs/i18n/sv/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/sv/_ideia/defer/787-auto-research.md b/docs/i18n/sv/_ideia/defer/787-auto-research.md deleted file mode 100644 index d5fa7725b0..0000000000 --- a/docs/i18n/sv/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/sv/_ideia/defer/792-team-of-rivals.md b/docs/i18n/sv/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index b0ceed90f5..0000000000 --- a/docs/i18n/sv/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/sv/_ideia/defer/797-hierarchical-router.md b/docs/i18n/sv/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 57a317ab24..0000000000 --- a/docs/i18n/sv/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/sv/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/sv/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index f00b2a203e..0000000000 --- a/docs/i18n/sv/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/sv/_ideia/defer/980-lkgp-routing.md b/docs/i18n/sv/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index a852f011a2..0000000000 --- a/docs/i18n/sv/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/sv/_ideia/notfit/1023-providers-independent.md b/docs/i18n/sv/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index a174af60af..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/sv/_ideia/notfit/1046-native-playground.md b/docs/i18n/sv/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index c62d6361ce..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/sv/_ideia/notfit/1100-headroom-support.md b/docs/i18n/sv/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index b7c5d7ab8e..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/sv/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/sv/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 6f8a0c187d..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/sv/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/sv/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 91c2a15b78..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/sv/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/sv/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 8007418f9d..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/sv/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/sv/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 6def802ef4..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 07b62d9018..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 4967975c95..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/sv/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/sv/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index d616d8e709..0000000000 --- a/docs/i18n/sv/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/sv/_ideia/notfit/804-9router-migration.md b/docs/i18n/sv/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 6b81e5fb06..0000000000 --- a/docs/i18n/sv/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/sv/_ideia/notfit/833-termux-android-support.md b/docs/i18n/sv/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 2ed71553a3..0000000000 --- a/docs/i18n/sv/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/sv/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/sv/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 79efca9ed7..0000000000 --- a/docs/i18n/sv/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/sv/_ideia/notfit/945-telegram-integration.md b/docs/i18n/sv/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 936592fe02..0000000000 --- a/docs/i18n/sv/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/sv/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/sv/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 2effa67daa..0000000000 --- a/docs/i18n/sv/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/sv/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/sv/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index b8555d3727..0000000000 --- a/docs/i18n/sv/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 481051e1d4..0000000000 --- a/docs/i18n/sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/sv/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/sv/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 6292b2939d..0000000000 --- a/docs/i18n/sv/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/sv/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/sv/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index ade6806ff5..0000000000 --- a/docs/i18n/sv/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/sv/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/sv/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 414c4205ed..0000000000 --- a/docs/i18n/sv/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 982b24558f..0000000000 --- a/docs/i18n/sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/sv/src/lib/a2a/README.md b/docs/i18n/sv/src/lib/a2a/README.md deleted file mode 100644 index 139e39206f..0000000000 --- a/docs/i18n/sv/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Svenska) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Arkitektur - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Snabbstart - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Licens - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/th/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/th/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index e44389ff23..0000000000 --- a/docs/i18n/th/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/th/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/th/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 19453568a7..0000000000 --- a/docs/i18n/th/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 0b59dfaac2..0000000000 --- a/docs/i18n/th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/th/_ideia/defer/1182-tps-metric.md b/docs/i18n/th/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 66ad2af23f..0000000000 --- a/docs/i18n/th/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 6d81f3e3ec..0000000000 --- a/docs/i18n/th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index f05fef1b82..0000000000 --- a/docs/i18n/th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/th/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/th/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index dad2407e87..0000000000 --- a/docs/i18n/th/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/th/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/th/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index a6c23023e9..0000000000 --- a/docs/i18n/th/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/th/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/th/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 2f09357e46..0000000000 --- a/docs/i18n/th/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/th/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/th/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 13f387b081..0000000000 --- a/docs/i18n/th/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/th/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/th/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index fa3ed5977d..0000000000 --- a/docs/i18n/th/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/th/_ideia/defer/785-task-class-routing.md b/docs/i18n/th/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index a8c6e1352a..0000000000 --- a/docs/i18n/th/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/th/_ideia/defer/787-auto-research.md b/docs/i18n/th/_ideia/defer/787-auto-research.md deleted file mode 100644 index 10d2690867..0000000000 --- a/docs/i18n/th/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/th/_ideia/defer/792-team-of-rivals.md b/docs/i18n/th/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 45825d54ca..0000000000 --- a/docs/i18n/th/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/th/_ideia/defer/797-hierarchical-router.md b/docs/i18n/th/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 375c8e326f..0000000000 --- a/docs/i18n/th/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/th/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/th/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 43b91d70a2..0000000000 --- a/docs/i18n/th/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/th/_ideia/defer/980-lkgp-routing.md b/docs/i18n/th/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index a412bea10d..0000000000 --- a/docs/i18n/th/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/th/_ideia/notfit/1023-providers-independent.md b/docs/i18n/th/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index c3df1a4e2c..0000000000 --- a/docs/i18n/th/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/th/_ideia/notfit/1046-native-playground.md b/docs/i18n/th/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 948579ff24..0000000000 --- a/docs/i18n/th/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/th/_ideia/notfit/1100-headroom-support.md b/docs/i18n/th/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 7b35c4cfb7..0000000000 --- a/docs/i18n/th/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/th/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/th/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 9960b88ea2..0000000000 --- a/docs/i18n/th/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/th/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/th/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 24f8b92e9d..0000000000 --- a/docs/i18n/th/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/th/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/th/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 64596af82e..0000000000 --- a/docs/i18n/th/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/th/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/th/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index df1d8ea2e2..0000000000 --- a/docs/i18n/th/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 08e92b6967..0000000000 --- a/docs/i18n/th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 00193d378c..0000000000 --- a/docs/i18n/th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/th/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/th/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 8fd58d4638..0000000000 --- a/docs/i18n/th/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/th/_ideia/notfit/804-9router-migration.md b/docs/i18n/th/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index a47cbd7bc7..0000000000 --- a/docs/i18n/th/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/th/_ideia/notfit/833-termux-android-support.md b/docs/i18n/th/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 37e8d6523b..0000000000 --- a/docs/i18n/th/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/th/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/th/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index b23507a80a..0000000000 --- a/docs/i18n/th/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/th/_ideia/notfit/945-telegram-integration.md b/docs/i18n/th/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 393cf7eca9..0000000000 --- a/docs/i18n/th/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/th/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/th/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 8718b0d047..0000000000 --- a/docs/i18n/th/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/th/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/th/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index ec963416df..0000000000 --- a/docs/i18n/th/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index b71ed7e81b..0000000000 --- a/docs/i18n/th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/th/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/th/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 2ef2d94121..0000000000 --- a/docs/i18n/th/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/th/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/th/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index e247238c8c..0000000000 --- a/docs/i18n/th/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/th/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/th/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index ebdd5bde68..0000000000 --- a/docs/i18n/th/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 2edabc8266..0000000000 --- a/docs/i18n/th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/th/src/lib/a2a/README.md b/docs/i18n/th/src/lib/a2a/README.md deleted file mode 100644 index 9240c32938..0000000000 --- a/docs/i18n/th/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (ไทย) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## สถาปัตยกรรม - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## เริ่มต้นอย่างรวดเร็ว - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## สิทธิ์การใช้งาน - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/tr/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/tr/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 4e8daa08f2..0000000000 --- a/docs/i18n/tr/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/tr/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/tr/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index ee7d1eebb1..0000000000 --- a/docs/i18n/tr/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index b72c8908b8..0000000000 --- a/docs/i18n/tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/tr/_ideia/defer/1182-tps-metric.md b/docs/i18n/tr/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 8d6791c273..0000000000 --- a/docs/i18n/tr/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index dff4f571b2..0000000000 --- a/docs/i18n/tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index c82e70998c..0000000000 --- a/docs/i18n/tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/tr/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/tr/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index c4d52ad4a1..0000000000 --- a/docs/i18n/tr/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/tr/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/tr/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index ba1b7292ac..0000000000 --- a/docs/i18n/tr/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/tr/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/tr/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index b134d65009..0000000000 --- a/docs/i18n/tr/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/tr/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/tr/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index ca87c2f094..0000000000 --- a/docs/i18n/tr/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/tr/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/tr/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 901d2e069d..0000000000 --- a/docs/i18n/tr/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/tr/_ideia/defer/785-task-class-routing.md b/docs/i18n/tr/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index ba3830580f..0000000000 --- a/docs/i18n/tr/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/tr/_ideia/defer/787-auto-research.md b/docs/i18n/tr/_ideia/defer/787-auto-research.md deleted file mode 100644 index 88159bb2d0..0000000000 --- a/docs/i18n/tr/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/tr/_ideia/defer/792-team-of-rivals.md b/docs/i18n/tr/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 6fd378e9c0..0000000000 --- a/docs/i18n/tr/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/tr/_ideia/defer/797-hierarchical-router.md b/docs/i18n/tr/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 7e74ea870b..0000000000 --- a/docs/i18n/tr/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/tr/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/tr/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 5bfcc272ae..0000000000 --- a/docs/i18n/tr/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/tr/_ideia/defer/980-lkgp-routing.md b/docs/i18n/tr/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 2d5b6cf0fb..0000000000 --- a/docs/i18n/tr/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/tr/_ideia/notfit/1023-providers-independent.md b/docs/i18n/tr/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 326b6d35ff..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/tr/_ideia/notfit/1046-native-playground.md b/docs/i18n/tr/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 0a1d150a2d..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/tr/_ideia/notfit/1100-headroom-support.md b/docs/i18n/tr/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 333bbf9041..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/tr/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/tr/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index b0af5c9777..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/tr/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/tr/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 136ea142bd..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/tr/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/tr/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 3fdfcc94c3..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/tr/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/tr/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 2820f3d2fc..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 6a1c36ec24..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 8fe1fbc202..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/tr/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/tr/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 317c78e583..0000000000 --- a/docs/i18n/tr/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/tr/_ideia/notfit/804-9router-migration.md b/docs/i18n/tr/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 2f6f273372..0000000000 --- a/docs/i18n/tr/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/tr/_ideia/notfit/833-termux-android-support.md b/docs/i18n/tr/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index f6e3e8a34b..0000000000 --- a/docs/i18n/tr/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/tr/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/tr/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index ab5de458f9..0000000000 --- a/docs/i18n/tr/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/tr/_ideia/notfit/945-telegram-integration.md b/docs/i18n/tr/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index ef10245b37..0000000000 --- a/docs/i18n/tr/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/tr/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/tr/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index e866bda57d..0000000000 --- a/docs/i18n/tr/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/tr/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/tr/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 8951f25be7..0000000000 --- a/docs/i18n/tr/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 23860e03d0..0000000000 --- a/docs/i18n/tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/tr/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/tr/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index d586fd79ee..0000000000 --- a/docs/i18n/tr/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/tr/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/tr/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index 0e817104ff..0000000000 --- a/docs/i18n/tr/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/tr/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/tr/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index ff9357771a..0000000000 --- a/docs/i18n/tr/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index ae75766549..0000000000 --- a/docs/i18n/tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/tr/src/lib/a2a/README.md b/docs/i18n/tr/src/lib/a2a/README.md deleted file mode 100644 index ac53db4677..0000000000 --- a/docs/i18n/tr/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Türkçe) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Mimari - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Hızlı Başlangıç - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Lisans - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/uk-UA/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/uk-UA/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 2237fe79a3..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index 69519b5133..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 3e4af912ff..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/uk-UA/_ideia/defer/1182-tps-metric.md b/docs/i18n/uk-UA/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index d948860cd8..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 11564c7944..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index e7b15b593a..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/uk-UA/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/uk-UA/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index 68a211b717..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 22632426fd..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 13b72cab1e..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/uk-UA/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/uk-UA/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index fa83bb859b..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/uk-UA/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/uk-UA/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index e380335e68..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/uk-UA/_ideia/defer/785-task-class-routing.md b/docs/i18n/uk-UA/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 1d53990df2..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/uk-UA/_ideia/defer/787-auto-research.md b/docs/i18n/uk-UA/_ideia/defer/787-auto-research.md deleted file mode 100644 index 6bf924cac7..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/uk-UA/_ideia/defer/792-team-of-rivals.md b/docs/i18n/uk-UA/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index f171b8c5dd..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/uk-UA/_ideia/defer/797-hierarchical-router.md b/docs/i18n/uk-UA/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 8f22d32b3c..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/uk-UA/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/uk-UA/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 256e73bc4b..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/uk-UA/_ideia/defer/980-lkgp-routing.md b/docs/i18n/uk-UA/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 94462788cb..0000000000 --- a/docs/i18n/uk-UA/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/uk-UA/_ideia/notfit/1023-providers-independent.md b/docs/i18n/uk-UA/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 2f3d75673d..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/uk-UA/_ideia/notfit/1046-native-playground.md b/docs/i18n/uk-UA/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 3632e89cb1..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/uk-UA/_ideia/notfit/1100-headroom-support.md b/docs/i18n/uk-UA/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index 62e6744de0..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 95dc7f290e..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/uk-UA/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/uk-UA/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 7b8c45890d..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/uk-UA/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/uk-UA/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 2001bcee4a..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/uk-UA/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/uk-UA/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 040ebc5804..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 30e4d618a4..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 1c49392b00..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index bd6c14933a..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/uk-UA/_ideia/notfit/804-9router-migration.md b/docs/i18n/uk-UA/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 4c824ec67b..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/uk-UA/_ideia/notfit/833-termux-android-support.md b/docs/i18n/uk-UA/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index e1b4ccb9ec..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/uk-UA/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/uk-UA/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 4b94fa88d3..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/uk-UA/_ideia/notfit/945-telegram-integration.md b/docs/i18n/uk-UA/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index b1475ba553..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/uk-UA/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/uk-UA/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 58dc240c20..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/uk-UA/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/uk-UA/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index e9ad1f9c5f..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index 23c3df2002..0000000000 --- a/docs/i18n/uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/uk-UA/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/uk-UA/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 594b8f2ea8..0000000000 --- a/docs/i18n/uk-UA/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/uk-UA/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/uk-UA/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index e33a436f23..0000000000 --- a/docs/i18n/uk-UA/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index cdd675d04e..0000000000 --- a/docs/i18n/uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 4f1f3ca4e3..0000000000 --- a/docs/i18n/uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/uk-UA/src/lib/a2a/README.md b/docs/i18n/uk-UA/src/lib/a2a/README.md deleted file mode 100644 index 96fb2ad41c..0000000000 --- a/docs/i18n/uk-UA/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Українська) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Архітектура - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Швидкий старт - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Ліцензія - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/vi/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/vi/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 27305c9c7f..0000000000 --- a/docs/i18n/vi/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/vi/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/vi/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index c046b021f9..0000000000 --- a/docs/i18n/vi/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 3d5793a640..0000000000 --- a/docs/i18n/vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/vi/_ideia/defer/1182-tps-metric.md b/docs/i18n/vi/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 1f967c8b07..0000000000 --- a/docs/i18n/vi/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 22d110dc2c..0000000000 --- a/docs/i18n/vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index fa7c71ffb0..0000000000 --- a/docs/i18n/vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/vi/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/vi/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index c07c76fe56..0000000000 --- a/docs/i18n/vi/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/vi/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/vi/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index 7ee1613777..0000000000 --- a/docs/i18n/vi/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/vi/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/vi/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 95d844bfb7..0000000000 --- a/docs/i18n/vi/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/vi/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/vi/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 035d683787..0000000000 --- a/docs/i18n/vi/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/vi/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/vi/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index bce5b2642b..0000000000 --- a/docs/i18n/vi/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/vi/_ideia/defer/785-task-class-routing.md b/docs/i18n/vi/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 05a78d45b7..0000000000 --- a/docs/i18n/vi/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/vi/_ideia/defer/787-auto-research.md b/docs/i18n/vi/_ideia/defer/787-auto-research.md deleted file mode 100644 index 20557acffc..0000000000 --- a/docs/i18n/vi/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/vi/_ideia/defer/792-team-of-rivals.md b/docs/i18n/vi/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index 9928b53da0..0000000000 --- a/docs/i18n/vi/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/vi/_ideia/defer/797-hierarchical-router.md b/docs/i18n/vi/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index 6dd50d9de7..0000000000 --- a/docs/i18n/vi/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/vi/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/vi/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 8a003ed5c7..0000000000 --- a/docs/i18n/vi/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/vi/_ideia/defer/980-lkgp-routing.md b/docs/i18n/vi/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index 36c8e58196..0000000000 --- a/docs/i18n/vi/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/vi/_ideia/notfit/1023-providers-independent.md b/docs/i18n/vi/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index 6f1a55502b..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/vi/_ideia/notfit/1046-native-playground.md b/docs/i18n/vi/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 57fae0edc0..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/vi/_ideia/notfit/1100-headroom-support.md b/docs/i18n/vi/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index ba53051210..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/vi/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/vi/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index 23cb09f99f..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/vi/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/vi/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 61f55c4cfe..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/vi/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/vi/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 4779844b0e..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/vi/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/vi/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 4f0f298cf7..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 3bbc647d68..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 54021be3af..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/vi/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/vi/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index 35c62c7916..0000000000 --- a/docs/i18n/vi/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/vi/_ideia/notfit/804-9router-migration.md b/docs/i18n/vi/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index 1115e7be6d..0000000000 --- a/docs/i18n/vi/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/vi/_ideia/notfit/833-termux-android-support.md b/docs/i18n/vi/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index 510986df4f..0000000000 --- a/docs/i18n/vi/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/vi/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/vi/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 6c492fe15a..0000000000 --- a/docs/i18n/vi/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/vi/_ideia/notfit/945-telegram-integration.md b/docs/i18n/vi/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index b0bfe642cd..0000000000 --- a/docs/i18n/vi/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/vi/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/vi/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 1506c7735c..0000000000 --- a/docs/i18n/vi/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/vi/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/vi/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 714cfe593c..0000000000 --- a/docs/i18n/vi/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index cd02fbcc2b..0000000000 --- a/docs/i18n/vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/vi/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/vi/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 895d0681ac..0000000000 --- a/docs/i18n/vi/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/vi/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/vi/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index b2aa40475a..0000000000 --- a/docs/i18n/vi/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/vi/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/vi/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index 57692fb68b..0000000000 --- a/docs/i18n/vi/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 5ed702f074..0000000000 --- a/docs/i18n/vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/vi/src/lib/a2a/README.md b/docs/i18n/vi/src/lib/a2a/README.md deleted file mode 100644 index 7e3d5e7981..0000000000 --- a/docs/i18n/vi/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (Tiếng Việt) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## Kiến trúc - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## Bắt đầu nhanh - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## Giấy phép - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License. diff --git a/docs/i18n/zh-CN/_ideia/defer/1041-smart-auto-combos.md b/docs/i18n/zh-CN/_ideia/defer/1041-smart-auto-combos.md deleted file mode 100644 index 0e016c1362..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1041-smart-auto-combos.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Smart Auto-Combos — Dynamic model composition (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1041-smart-auto-combos.md) · 🇪🇸 [es](../../../es/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇪 [de](../../../de/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇹 [it](../../../it/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1041-smart-auto-combos.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1041-smart-auto-combos.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇳 [in](../../../in/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇭 [th](../../../th/_ideia/defer/1041-smart-auto-combos.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇩 [id](../../../id/_ideia/defer/1041-smart-auto-combos.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1041-smart-auto-combos.md) · 🇳🇴 [no](../../../no/_ideia/defer/1041-smart-auto-combos.md) · 🇩🇰 [da](../../../da/_ideia/defer/1041-smart-auto-combos.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1041-smart-auto-combos.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1041-smart-auto-combos.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1041-smart-auto-combos.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1041-smart-auto-combos.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1041-smart-auto-combos.md) · 🇮🇱 [he](../../../he/_ideia/defer/1041-smart-auto-combos.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1041-smart-auto-combos.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1041-smart-auto-combos.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1041-smart-auto-combos.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1041-smart-auto-combos.md) - ---- - -> GitHub Issue: #1041 — opened by @oyi77 on 2026-04-07 -> Status: 📋 Cataloged | Priority: High - -## 📝 Original Request - -When a user first sets up OmniRoute they manually build an Auto-Combo that reflects current credentials. The combo gets stale immediately when new API keys/providers are added or better models are released. - -**Proposed: "Smart Combo" mode** — combo member list is re-evaluated at routing time against all currently active credentials, rather than being a fixed array. - -## 💬 Community Discussion - -### Participants - -- @oyi77 — Original requester (power user, contributor) -- @kilo-code-bot — Flagged similarity to #563 (91%), but author explained distinction - -### Key Points - -- **#563 (closed)** was about routing an incoming model pattern to a specific combo (routing layer) -- **This issue** is about the combo's own member list being dynamic (composition layer) -- Combo should auto-update when credentials/providers change -- Should respect user-configured constraints (exclude lists, priority overrides) - -## 🎯 Refined Feature Description - -Add a "Smart" toggle to combo creation that makes the combo's model member list dynamically computed at routing time. Instead of storing fixed model IDs, it evaluates all currently active credentials/models and selects the best options. - -### What it solves - -- Stale combos when new API keys are added -- Models not being used when newly synced from models.dev -- Disabled credentials still being tried - -### How it should work (high level) - -1. User creates combo with "Smart" toggle ON -2. Configures filters/constraints (provider whitelist/blacklist, model pattern regex, cost tier limits) -3. At request time, combo engine queries active credentials + model catalog -4. Dynamically computes the member list based on filters + scoring (LKGP, latency, cost) -5. Routes using the dynamically computed list with the selected strategy - -### Affected areas - -- `open-sse/services/combo.ts` — core routing engine -- `open-sse/services/autoCombo/` — auto-combo scoring -- `src/lib/db/combos.ts` — combo schema changes -- `src/shared/validation/schemas.ts` — new combo type schema -- Dashboard combo creation UI - -## 📎 Attachments & References - -- Discussion with @kilo-code-bot distinguishing from #563 - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP could feed scoring -- Related to [785-task-class-routing](./785-task-class-routing.md) — task-aware routing diff --git a/docs/i18n/zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md b/docs/i18n/zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md deleted file mode 100644 index ed4a81c212..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md +++ /dev/null @@ -1,64 +0,0 @@ -# Feature: Providers as dynamic plugins/addons (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1112-providers-dynamic-plugins.md) · 🇪🇸 [es](../../../es/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇪 [de](../../../de/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇹 [it](../../../it/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇳 [in](../../../in/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇭 [th](../../../th/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇩 [id](../../../id/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇳🇴 [no](../../../no/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇩🇰 [da](../../../da/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇮🇱 [he](../../../he/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1112-providers-dynamic-plugins.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1112-providers-dynamic-plugins.md) - ---- - -> GitHub Issue: #1112 — opened by @diegosouzapw on 2026-04-10T09:36:17Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem - -Currently, adding new providers requires deep integration across the codebase (`open-sse/executors`, `open-sse/config/providerRegistry.ts`, etc.). It's somewhat modularized but not a true drop-in system, making it harder for the community to contribute new providers as simple add-ons. - -### Proposed Solution - -Implement a dynamic drop-in plugin system that loads providers at runtime from a dedicated `plugins/` or `addons/` directory, allowing users to just drop a `.js` / `.ts` file or folder into the directory to register a new provider without modifying core code. - -### Implementation Ideas - -- Expose a stable Plugin API or SDK (`ProviderDefinition` interface). -- Dynamic imports to load files from `addons/providers/` at startup. -- Update the UI to show dynamically loaded providers alongside built-in ones. - -### Current Workarounds - -Currently, any new provider must be hardcoded into the TypeScript source code and the project needs to be recompiled. - -### Additional Context - -Source: Discussion #1084 - -## 💬 Community Discussion - -(No comments yet, originated from discussion) - -## 🎯 Refined Feature Description - -Create a robust standard plugin interface where a self-contained JS/TS bundle can define: - -- Metadata (ID, name, auth format) -- `executor` logic (how to request) -- Config schemas - And drop it into a `/addons/` folder. The app loads these dynamically on boot via `import()` or `require()`. - -### What it solves - -Decouples new provider implementations from the core codebase. -Enables closed-source or specialized community providers. -Simplifies PRs (less modification of core registries). - -### Affected areas - -- `open-sse/config/providerRegistry.ts` (needs dynamic loading phase) -- Next.js build config (allowing external requires) - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -N/A diff --git a/docs/i18n/zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md b/docs/i18n/zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md deleted file mode 100644 index 75d7a999f9..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md +++ /dev/null @@ -1,105 +0,0 @@ -# Feature: [Feature] Add plan-aware GitHub Copilot model filtering and refresh the GitHub model catalog (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇪🇸 [es](../../../es/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇪 [de](../../../de/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇹 [it](../../../it/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇳 [in](../../../in/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇭 [th](../../../th/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇩 [id](../../../id/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇳🇴 [no](../../../no/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇩🇰 [da](../../../da/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇮🇱 [he](../../../he/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1168-feature-add-plan-aware-github-copilot-model-filtering-and-refresh-the-github-model-catalog.md) - ---- - -> GitHub Issue: #1168 — opened by @demiolawunmi on 2026-04-11T23:09:31Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -It would be helpful to improve the GitHub Copilot integration by making model availability plan-aware and updating the listed models to match GitHub’s current documentation. - -Right now, the available model list appears out of sync with GitHub’s latest Copilot docs, and there is no clear way to distinguish which models should be shown for different Copilot entitlements. GitHub’s documentation notes that model availability can vary by plan and by client, and that some models may not be available depending on the user’s plan. - -This creates confusion for users on GitHub Copilot Student, because Student does not have the same model access as Pro+. GitHub’s plans docs say Copilot Student includes unlimited completions, access to premium models in Copilot Chat, and a monthly premium request allowance, while Copilot Pro+ includes full access to all available models in Copilot Chat. :contentReference[oaicite:1]{index=1} - -As a result, the integration can currently expose models that are not actually available for a user’s GitHub Copilot plan, and the displayed GitHub model list may not reflect the current supported model catalog from GitHub’s docs. - -Copilot student only has access to these models: Claude Haiku 4.5 Gemini 2.5 Pro Gemini 3 Flash Gemini 3.1 Pro GPT-4.1 GPT-5 mini GPT-5.1 GPT-5.2 GPT-5.2-Codex GPT-5.3-Codex GPT-5.4 mini Grok Code Fast 1 Raptor mini - -### Proposed Solution - -Add plan-aware handling for the GitHub Copilot provider. - -Suggested behavior: - -- Allow the GitHub provider to distinguish between Copilot Free, Student, Pro, and Pro+. -- Only show models that are actually available for the selected or detected plan. -- Clearly label models as included vs premium where relevant. -- Refresh the GitHub Copilot model catalog so it stays aligned with GitHub’s current supported-model documentation. -- If plan auto-detection is not possible, add a manual setting so users can choose their Copilot entitlement. - -This would make the GitHub provider more accurate and would prevent users from selecting models that GitHub does not make available under their current plan. GitHub’s docs already distinguish plans and supported models, so reflecting that in OmniRoute would improve correctness and UX. :contentReference[oaicite:3]{index=3} - -### Alternatives Considered - -Current workarounds are limited: - -- Manually ignore models that are not available under the user’s plan. -- Manually compare OmniRoute’s GitHub model list against GitHub’s docs. -- Use trial and error to see which models actually work. - -These workarounds are inconvenient and easy to get wrong, especially because GitHub’s supported model list and plan access can change over time. :contentReference[oaicite:4]{index=4} - -### Acceptance Criteria - -- GitHub Copilot models are filtered by plan entitlement (at minimum: Free, Student, Pro, Pro+). -- Unsupported GitHub Copilot models are hidden or clearly marked unavailable for the selected plan. -- The GitHub provider’s model list matches GitHub’s current supported-model documentation. -- If plan detection is not automatic, a manual plan selector is available in provider settings. -- Existing non-GitHub providers remain unaffected. -- Tests cover plan-based filtering and GitHub model list updates. - -### Area - -Provider Support - -### Related Provider(s) - -Github Copilot - -### Additional Context - -GitHub’s official documentation currently separates Copilot plans and supported AI models. The docs also state that Pro+ has full access to all available models, while other plans have different limits and allowances. GitHub also notes that supported models vary by client and that some models may not be available depending on the plan. :contentReference[oaicite:5]{index=5} - -Because of that, plan-aware filtering would make the GitHub provider more accurate and less confusing, especially for Copilot Student users. - -### Expected Test Plan - -- Add unit tests for GitHub provider plan-based model filtering. -- Add coverage for Student, Pro, and Pro+ model visibility behavior. -- Add or update tests for the GitHub provider model registry / model list sync. -- Verify that unavailable models are hidden or marked correctly. -- Verify that existing provider integrations remain unchanged. - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/zh-CN/_ideia/defer/1182-tps-metric.md b/docs/i18n/zh-CN/_ideia/defer/1182-tps-metric.md deleted file mode 100644 index 4e2933c2ab..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1182-tps-metric.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature: Add TPS (Tokens Per Second) Metric (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1182-tps-metric.md) · 🇪🇸 [es](../../../es/_ideia/defer/1182-tps-metric.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1182-tps-metric.md) · 🇩🇪 [de](../../../de/_ideia/defer/1182-tps-metric.md) · 🇮🇹 [it](../../../it/_ideia/defer/1182-tps-metric.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1182-tps-metric.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1182-tps-metric.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1182-tps-metric.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1182-tps-metric.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1182-tps-metric.md) · 🇮🇳 [in](../../../in/_ideia/defer/1182-tps-metric.md) · 🇹🇭 [th](../../../th/_ideia/defer/1182-tps-metric.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1182-tps-metric.md) · 🇮🇩 [id](../../../id/_ideia/defer/1182-tps-metric.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1182-tps-metric.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1182-tps-metric.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1182-tps-metric.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1182-tps-metric.md) · 🇳🇴 [no](../../../no/_ideia/defer/1182-tps-metric.md) · 🇩🇰 [da](../../../da/_ideia/defer/1182-tps-metric.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1182-tps-metric.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1182-tps-metric.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1182-tps-metric.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1182-tps-metric.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1182-tps-metric.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1182-tps-metric.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1182-tps-metric.md) · 🇮🇱 [he](../../../he/_ideia/defer/1182-tps-metric.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1182-tps-metric.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1182-tps-metric.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1182-tps-metric.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1182-tps-metric.md) - ---- - -> GitHub Issue: #1182 — opened by @uwuclxdy on 2026-04-12 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -Add a Tokens Per Second (TPS) metric to the OmniRoute dashboard to measure and display the speed of model responses. This would help users compare provider/model performance and make informed routing decisions. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1339, #1364) -- 3 comments in discussion thread - -### Key Points - -- TPS is a key metric for comparing streaming performance across providers -- Would require measuring token output rate during streaming responses -- Useful for both real-time display (per-request) and historical aggregation -- Could feed into routing decisions (e.g., prefer faster providers for interactive use) - -## 🎯 Refined Feature Description - -Instrument the streaming response pipeline to measure and display Tokens Per Second (TPS) — the rate at which tokens are generated — per request, per model, and per provider. - -### What it solves - -- No visibility into streaming response speed across providers/models -- Cannot compare provider performance objectively -- Cannot make routing decisions based on throughput - -### How it should work (high level) - -1. During streaming responses, track the time between the first and last token -2. Count output tokens from the response `usage` field or chunk count -3. Calculate TPS = total_output_tokens / (last_token_time - first_token_time) -4. Display TPS on: individual request logs, provider metrics, combo metrics -5. Optionally expose TPS via the MCP server `get_provider_metrics` tool -6. Store historical TPS data for trend analysis in the dashboard - -### Affected areas - -- `open-sse/handlers/chatCore.ts` — instrument streaming for timing -- `open-sse/services/usage.ts` — store TPS alongside existing usage metrics -- `src/lib/db/detailedLogs.ts` — add TPS column to detailed logs -- `src/app/(dashboard)/dashboard/logs/` — display TPS in log entries -- `src/app/(dashboard)/dashboard/endpoint/` — display TPS in provider/combo metrics -- DB migrations — new `tps` column in relevant tables - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- TPS data could feed into [1041-smart-auto-combos](./1041-smart-auto-combos.md) scoring -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — throughput as routing signal diff --git a/docs/i18n/zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md b/docs/i18n/zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md deleted file mode 100644 index 4e37ed776c..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] Add GLM 5.1 support and fix tool-calling compatibility (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇪🇸 [es](../../../es/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇪 [de](../../../de/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇹 [it](../../../it/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇳 [in](../../../in/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇭 [th](../../../th/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇩 [id](../../../id/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇳🇴 [no](../../../no/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇩🇰 [da](../../../da/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇮🇱 [he](../../../he/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1199-feature-add-glm-5-1-support-and-fix-tool-calling-compatibility.md) - ---- - -> GitHub Issue: #1199 — opened by @CmetankaJDD on 2026-04-13T07:57:20Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -## Summary - -Please add support for GLM 5.1 in OmniRoute. - -At the moment, GLM 5.1 appears to have problems with tool usage / tool calling, which makes it hard to use in agent-style workflows. - -## Current behavior - -- GLM 5.1 is not available or not fully supported as a first-class model option. -- When trying to use tools with GLM 5.1, requests fail / tool usage does not work correctly. - -## Expected behavior - -- GLM 5.1 should be supported as a selectable model/provider option. -- Tool calling should work correctly with the model, following the same OpenAI-compatible tool schema behavior expected by OmniRoute clients. - -## Why this matters - -GLM 5.1 is useful for users who want broader model coverage in OmniRoute, and tool-calling support is required for many coding assistants, agents, and structured workflows. - -## Suggested scope - -- Add GLM 5.1 model support -- Validate request/response compatibility for tools -- Ensure tool call messages are translated correctly if provider-specific mapping is needed -- Add a basic regression test for tool usage with GLM 5.1 - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md b/docs/i18n/zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md deleted file mode 100644 index 9bd5154969..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md +++ /dev/null @@ -1,114 +0,0 @@ -# Feature: [Feature] Native support for Tavily Extract, Crawl, Map, and Research endpoints (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇪🇸 [es](../../../es/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇪 [de](../../../de/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇹 [it](../../../it/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇳 [in](../../../in/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇭 [th](../../../th/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇩 [id](../../../id/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇳🇴 [no](../../../no/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇩🇰 [da](../../../da/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇮🇱 [he](../../../he/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1217-feature-native-support-for-tavily-extract-crawl-map-and-research-endpoints.md) - ---- - -> GitHub Issue: #1217 — opened by @edwardsconnects90 on 2026-04-13T15:57:08Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -OmniRoute registers Tavily as a search provider (`tavily-search` in `searchRegistry.ts`) and successfully proxies `/v1/search` requests. However, the Tavily API exposes four additional endpoints that are widely used by MCP integrations and AI agents: - -- `POST /extract` — extract structured content from URLs -- `POST /crawl` — crawl websites with configurable depth/breadth -- `POST /map` — map website structure (URL discovery) -- `POST /research` — deep multi-source research with async polling (`GET /research/:id`) - -When a client (e.g., Tavily MCP server) is configured with `TAVILY_BASE_URL` pointing to OmniRoute, only `/v1/search` works. The other four endpoints return **HTTP 404**, forcing users to either bypass OmniRoute entirely or maintain a separate proxy layer. - -This breaks the value proposition of OmniRoute as a unified gateway — Tavily credentials must be managed in two places, and usage of extract/crawl/map/research cannot be tracked or logged through OmniRoute's analytics. - -### Proposed Solution - -Add four new API routes that proxy requests to the corresponding Tavily API endpoints, reusing the existing `tavily-search` provider credentials from `provider_connections`: - -1. `POST /v1/extract` → `https://api.tavily.com/extract` -2. `POST /v1/crawl` → `https://api.tavily.com/crawl` -3. `POST /v1/map` → `https://api.tavily.com/map` -4. `POST /v1/research` → `https://api.tavily.com/research` -5. `GET /v1/research/:id` → `https://api.tavily.com/research/:id` (polling for async results) - -The routes should: - -- Resolve the Tavily API key from the existing `tavily-search` provider connection (same decryption path as `/v1/search`) -- Inject `api_key` into the request body and `Authorization: Bearer` header before forwarding -- Forward the request body as-is (passthrough) — no transformation needed -- Stream the response back to the client -- Record usage in call logs for analytics/cost tracking -- Respect the existing API key policy (`enforceApiKeyPolicy`) if enabled - -### Alternatives Considered - -1. **Client-side direct connection** — configure the MCP server to hit `api.tavily.com` directly. This works but defeats the purpose of OmniRoute as a centralized gateway, duplicates credential management, and loses visibility into usage analytics. - -2. **Separate reverse proxy** — run a lightweight proxy (nginx or Node.js) alongside OmniRoute that routes Tavily-specific endpoints directly while sending `/v1/search` through OmniRoute. Adds operational complexity and splits configuration. - -3. **Runtime hotfix** — monkey-patch `http.createServer` via `NODE_OPTIONS --require` to intercept the four routes before Next.js handles them. This is the current workaround and functions correctly, but it is fragile (bypasses OmniRoute's auth, logging, and cost tracking) and adds maintenance burden with each OmniRoute upgrade. - -### Acceptance Criteria - -- `POST /v1/extract` returns 200 with Tavily's response when given valid `urls` in the body -- `POST /v1/crawl` returns 200 with crawled page content -- `POST /v1/map` returns 200 with discovered URL list -- `POST /v1/research` returns 200 with `request_id` and `status: pending` -- `GET /v1/research/:id` returns the research result or current polling status -- All five endpoints resolve credentials from the existing `tavily-search` provider connection — no additional configuration required -- Requests are logged in OmniRoute's call log and visible in the dashboard analytics -- API key policy enforcement works consistently across all Tavily endpoints -- Existing `/v1/search` behavior (multi-provider selection, caching, cost tracking) is not affected - -### Area - -Proxy / Routing - -### Related Provider(s) - -Tavily (`tavily-search`) - -### Additional Context - -The Tavily MCP server (v0.2.18, official package `tavily-mcp` from `github.com/tavily-ai/tavily-mcp`) is commonly used with Claude Code, Cursor, and other AI coding tools. It supports the `TAVILY_BASE_URL` environment variable, making it straightforward to route through OmniRoute. The server registers all five tools (`tavily_search`, `tavily_extract`, `tavily_crawl`, `tavily_map`, `tavily_research`) and expects all endpoints to be available at the configured base URL. - -The `research` endpoint is asynchronous — it returns a `request_id` on POST, and the client polls `GET /research/:id` until `status` changes to `completed` or `failed`. The MCP server implements exponential backoff polling (2s initial, 1.5x factor, 10s max interval) with a timeout of 5 minutes (mini) or 15 minutes (pro/auto). - -Architecturally, these routes are simpler than `/v1/search` — they do not require multi-provider selection, response normalization, or request coalescing. A straightforward passthrough with credential injection and call logging would be sufficient. - -### Expected Test Plan - -- Add unit tests for each new route handler (extract, crawl, map, research, research polling) -- Add integration test verifying credential resolution from `provider_connections` -- Verify that call logs are recorded for each endpoint -- Verify that API key policy enforcement applies -- Keep `npm run test:coverage` at 60%+ - -## 💬 Community Discussion - -No community comments yet. - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/zh-CN/_ideia/defer/1251-minimax-oauth-provider.md b/docs/i18n/zh-CN/_ideia/defer/1251-minimax-oauth-provider.md deleted file mode 100644 index b3a5651949..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1251-minimax-oauth-provider.md +++ /dev/null @@ -1,60 +0,0 @@ -# Feature: Add MiniMax OAuth Provider (Device-Code + PKCE) (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1251-minimax-oauth-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1251-minimax-oauth-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1251-minimax-oauth-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1251-minimax-oauth-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1251-minimax-oauth-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1251-minimax-oauth-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1251-minimax-oauth-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1251-minimax-oauth-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1251-minimax-oauth-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1251-minimax-oauth-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1251-minimax-oauth-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1251-minimax-oauth-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1251-minimax-oauth-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1251-minimax-oauth-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1251-minimax-oauth-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1251-minimax-oauth-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1251-minimax-oauth-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1251-minimax-oauth-provider.md) - ---- - -> GitHub Issue: #1251 — opened by @Tasogarre on 2026-04-14 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add MiniMax as an OAuth-based provider using the device-code + PKCE flow. MiniMax is an AI model provider that offers models accessible through their API, and the author proposes using a device-code OAuth flow (similar to GitHub CLI's auth flow) combined with PKCE for security. - -## 💬 Community Discussion - -### Participants - -- @Tasogarre — Original requester, provided detailed OAuth flow specification - -### Key Points - -- Device-code + PKCE is a different OAuth pattern from OmniRoute's existing OAuth flows (browser redirect-based) -- Existing OAuth providers (Claude Code, Antigravity, Codex, GitHub Copilot, Cursor, etc.) use standard redirect flows -- Implementing device-code flow would require new OAuth infrastructure in `src/lib/oauth/` -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add MiniMax as an OAuth provider using the device-code grant type with PKCE, enabling users to authenticate via a displayed code + URL (like `gh auth login`) rather than browser redirects. - -### What it solves - -- Adds MiniMax model provider access to OmniRoute -- Introduces device-code OAuth flow type for headless/terminal environments -- Could benefit other future providers that use device-code authentication - -### How it should work (high level) - -1. User clicks "Connect MiniMax" in the dashboard -2. Dashboard displays a device code and URL (e.g., "Go to minimax.chat/device and enter code: ABCD-1234") -3. User visits URL, enters code, authorizes the application -4. OmniRoute polls the token endpoint until authorization is complete -5. Stores OAuth tokens and refreshes automatically - -### Affected areas - -- `src/lib/oauth/constants/oauth.ts` — new OAuth config for MiniMax -- `src/lib/oauth/` — new device-code flow handler (distinct from existing redirect flows) -- `open-sse/executors/` — new or default executor for MiniMax API -- `src/shared/constants/providers.ts` — register in `OAUTH_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration -- Dashboard OAuth modal — new device-code UI variant - -## 📎 Attachments & References - -- Author provided detailed OAuth flow specification in the issue body (2795 chars) - -## 🔗 Related Ideas - -- Related to existing OAuth providers architecture in `src/lib/oauth/` diff --git a/docs/i18n/zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md b/docs/i18n/zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md deleted file mode 100644 index c45d465196..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md +++ /dev/null @@ -1,58 +0,0 @@ -# Feature: Add Freepik Pikaso Image Generation Provider (Cookie/Subscription-Based) (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1276-freepik-pikaso-provider.md) · 🇪🇸 [es](../../../es/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇪 [de](../../../de/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇹 [it](../../../it/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇳 [in](../../../in/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇭 [th](../../../th/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇩 [id](../../../id/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇳🇴 [no](../../../no/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇩🇰 [da](../../../da/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇮🇱 [he](../../../he/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1276-freepik-pikaso-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1276-freepik-pikaso-provider.md) - ---- - -> GitHub Issue: #1276 — opened by @RaviTharuma on 2026-04-15 -> Status: ⏭️ DEFER | Priority: Low - -## 📝 Original Request - -Add Freepik Pikaso as a cookie/subscription-based image generation provider. Pikaso is Freepik's AI image generation tool that uses a session cookie for authentication and can be accessed through their web API. - -The author (@RaviTharuma) is a known contributor who built the Perplexity Web and Grok Web executors. - -## 💬 Community Discussion - -### Participants - -- @RaviTharuma — Original requester, contributor (built Perplexity Web + Grok Web executors) - -### Key Points - -- Would follow the same cookie-based executor pattern as Grok Web and Perplexity Web -- Freepik Pikaso uses subscription-based access (cookie auth) -- Needs reverse-engineering of the Pikaso API endpoints and response format -- No community discussion beyond the initial proposal - -## 🎯 Refined Feature Description - -Add a new cookie-based image generation executor for Freepik Pikaso, following the established pattern of web-subscription providers (Grok Web, Perplexity Web). - -### What it solves - -- Enables Freepik Pikaso subscribers to route image generation through OmniRoute -- Extends image generation provider coverage alongside existing DALL-E, SD WebUI, ComfyUI - -### How it should work (high level) - -1. User provides their Freepik session cookie in the dashboard -2. OmniRoute sends image generation requests to Pikaso's internal API -3. Responses are translated to the standard OmniRoute image generation format -4. Supports text-to-image generation with style/model parameters - -### Affected areas - -- `open-sse/executors/` — new `freepik-pikaso.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` or image-specific catalog -- `open-sse/handlers/imageGeneration.ts` — add Pikaso routing support -- `open-sse/config/providerRegistry.ts` — model registration - -## 📎 Attachments & References - -- No external references provided yet; needs API traffic capture - -## 🔗 Related Ideas - -- Same pattern as Grok Web and Perplexity Web cookie-based executors diff --git a/docs/i18n/zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md b/docs/i18n/zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md deleted file mode 100644 index 871074e779..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Per-Key Token Rate Limiting (TPM/TPD) (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇪🇸 [es](../../../es/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇪 [de](../../../de/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇹 [it](../../../it/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇳 [in](../../../in/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇭 [th](../../../th/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇩 [id](../../../id/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇳🇴 [no](../../../no/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇩🇰 [da](../../../da/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇮🇱 [he](../../../he/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1305-per-key-token-rate-limiting.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1305-per-key-token-rate-limiting.md) - ---- - -> GitHub Issue: #1305 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -OmniRoute already supports per-key request-based limits, but subscription-based API operators also need token-based limits to control upstream cost exposure. A single request to a large-context model can consume far more compute and cost than a normal request while still counting as only one request. - -**Use case examples (from author):** - -- Lite plan: 32K tokens/minute, 5M tokens/day -- Pro plan: 64K tokens/minute, 15M tokens/day - -**Proposed fields:** - -- `max_tokens_per_minute` (TPM) -- `max_tokens_per_day` (TPD) - -Returns HTTP 429 with `token_limit_exceeded` reason when exceeded. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, detailed operator-focused use case - -### Key Points - -- Addresses operators selling subscription-based AI API products through OmniRoute -- Request-only limits are insufficient for long-context or high-output models -- Token accounting should use actual usage from upstream response `usage` fields -- Must handle both streaming and non-streaming accounting paths -- Backward compatible — keys without token limits keep existing behavior - -## 🎯 Refined Feature Description - -Add optional per-API-key token-based rate limiting alongside existing request-based limits, enabling operators to enforce fair-use policies based on actual token consumption. - -### What it solves - -- Disproportionate cost exposure from large-context requests that count as single requests -- Inability to sell token-based subscription plans through OmniRoute -- Lack of per-customer cost protection for mixed model catalogs with varying context windows - -### How it should work (high level) - -1. Add `max_tokens_per_minute` and `max_tokens_per_day` optional fields to API key configuration -2. After each response, extract `usage.total_tokens` from the upstream response -3. Account consumed tokens to the authenticated key using sliding window counters -4. Before each request, check if the key has remaining token budget for the current window -5. If budget exceeded, return 429 with `token_limit_exceeded` error code and `Retry-After` header -6. For streaming responses, account tokens from the final usage chunk (`stream_options.include_usage`) -7. Dashboard UI: display TPM/TPD fields in the API key creation/edit modal - -### Affected areas - -- `src/lib/db/apiKeys.ts` — new columns for TPM/TPD limits -- `open-sse/services/rateLimitManager.ts` — token-based window tracking -- `open-sse/handlers/chatCore.ts` — post-response token accounting -- `src/app/api/v1/` routes — pre-request token budget check -- `src/app/(dashboard)/dashboard/settings/` — API key modal UI extension -- DB migrations — new columns on `api_keys` table - -## 📎 Attachments & References - -- Author's detailed acceptance criteria and test plan in issue body - -## 🔗 Related Ideas - -- Directly related to [1320-rate-limit-headers](./1320-rate-limit-headers.md) — expose token limits via standard headers diff --git a/docs/i18n/zh-CN/_ideia/defer/1320-rate-limit-headers.md b/docs/i18n/zh-CN/_ideia/defer/1320-rate-limit-headers.md deleted file mode 100644 index 989e663f1e..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1320-rate-limit-headers.md +++ /dev/null @@ -1,71 +0,0 @@ -# Feature: Standard Rate Limit Headers for Requests, Tokens, Resets, and Retry-After (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1320-rate-limit-headers.md) · 🇪🇸 [es](../../../es/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇪 [de](../../../de/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇹 [it](../../../it/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1320-rate-limit-headers.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1320-rate-limit-headers.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇳 [in](../../../in/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇭 [th](../../../th/_ideia/defer/1320-rate-limit-headers.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇩 [id](../../../id/_ideia/defer/1320-rate-limit-headers.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1320-rate-limit-headers.md) · 🇳🇴 [no](../../../no/_ideia/defer/1320-rate-limit-headers.md) · 🇩🇰 [da](../../../da/_ideia/defer/1320-rate-limit-headers.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1320-rate-limit-headers.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1320-rate-limit-headers.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1320-rate-limit-headers.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1320-rate-limit-headers.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1320-rate-limit-headers.md) · 🇮🇱 [he](../../../he/_ideia/defer/1320-rate-limit-headers.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1320-rate-limit-headers.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1320-rate-limit-headers.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1320-rate-limit-headers.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1320-rate-limit-headers.md) - ---- - -> GitHub Issue: #1320 — opened by @kaccang on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When a client is throttled, it should receive machine-readable rate-limit information via standard HTTP headers so it can back off correctly. Without explicit response headers, clients guess retry timing, producing unnecessary retry loops that increase pressure on the gateway. - -**Proposed headers (from author):** - -Request-based: - -- `X-RateLimit-Limit-Requests-Minute` / `X-RateLimit-Remaining-Requests-Minute` / `X-RateLimit-Reset-Requests-Minute` -- `X-RateLimit-Limit-Requests-Day` / `X-RateLimit-Remaining-Requests-Day` / `X-RateLimit-Reset-Requests-Day` - -Token-based (if configured): - -- `X-RateLimit-Limit-Tokens-Minute` / `X-RateLimit-Remaining-Tokens-Minute` / `X-RateLimit-Reset-Tokens-Minute` -- `X-RateLimit-Limit-Tokens-Day` / `X-RateLimit-Remaining-Tokens-Day` / `X-RateLimit-Reset-Tokens-Day` - -On 429: `Retry-After` header. - -## 💬 Community Discussion - -### Participants - -- @kaccang — Original requester, also opened #1305 (per-key token rate limiting) - -### Key Points - -- Aligns with OpenAI's rate-limit header convention -- Useful for SDKs, automation tools, and customer dashboards -- Backward compatible — clients that don't consume headers are unaffected -- Author provided detailed acceptance criteria and test plan - -## 🎯 Refined Feature Description - -Expose current rate-limit state via standard HTTP response headers on all API responses, and include `Retry-After` on 429 responses. - -### What it solves - -- Clients cannot determine remaining quota without trial-and-error -- SDKs and automation tools lack machine-readable throttling signals -- Unnecessary retry loops when clients guess retry timing - -### How it should work (high level) - -1. On every successful response, inject rate-limit headers reflecting the authenticated key's current state -2. On 429 responses, include `Retry-After` with the number of seconds until the next window -3. Request-based and token-based headers are independent — only include what is configured -4. Headers are derived from the existing `rateLimitManager` state, no new persistence needed - -### Affected areas - -- `open-sse/services/rateLimitManager.ts` — expose current window state -- `open-sse/handlers/chatCore.ts` — inject headers into response -- `src/app/api/v1/` routes — inject headers at route level -- `src/middleware/` — potential centralized header injection - -## 📎 Attachments & References - -- Author's test plan included in the issue body - -## 🔗 Related Ideas - -- Directly related to [1305-per-key-token-rate-limiting](./1305-per-key-token-rate-limiting.md) — both address rate-limit observability diff --git a/docs/i18n/zh-CN/_ideia/defer/1339-api-key-routing-rules.md b/docs/i18n/zh-CN/_ideia/defer/1339-api-key-routing-rules.md deleted file mode 100644 index 8fb326ff4b..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/1339-api-key-routing-rules.md +++ /dev/null @@ -1,59 +0,0 @@ -# Feature: API Key Routing Rules for Custom Endpoints (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/1339-api-key-routing-rules.md) · 🇪🇸 [es](../../../es/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇪 [de](../../../de/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇹 [it](../../../it/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/1339-api-key-routing-rules.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/1339-api-key-routing-rules.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇳 [in](../../../in/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇭 [th](../../../th/_ideia/defer/1339-api-key-routing-rules.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇩 [id](../../../id/_ideia/defer/1339-api-key-routing-rules.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/1339-api-key-routing-rules.md) · 🇳🇴 [no](../../../no/_ideia/defer/1339-api-key-routing-rules.md) · 🇩🇰 [da](../../../da/_ideia/defer/1339-api-key-routing-rules.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/1339-api-key-routing-rules.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/1339-api-key-routing-rules.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/1339-api-key-routing-rules.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/1339-api-key-routing-rules.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/1339-api-key-routing-rules.md) · 🇮🇱 [he](../../../he/_ideia/defer/1339-api-key-routing-rules.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/1339-api-key-routing-rules.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/1339-api-key-routing-rules.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/1339-api-key-routing-rules.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/1339-api-key-routing-rules.md) - ---- - -> GitHub Issue: #1339 — opened by @uwuclxdy on 2026-04-16 -> Status: ⏭️ DEFER | Priority: Medium - -## 📝 Original Request - -When using a custom OpenAI endpoint with multiple API keys, the only available routing option is "round-robin". The user wants the ability to configure routing strategies per-provider (e.g., "exhaust first key before using second"), similar to how combo-level strategies already work. - -The user included a screenshot of the API key popup in the dashboard, highlighting that there's no strategy selector available at the provider/connection level. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester, active contributor (also opened #1364, #1182) - -### Key Points - -- Currently, routing strategies (priority, weighted, fill-first, round-robin, etc.) are only configurable at the combo level -- Provider-level multi-key rotation is hardcoded to round-robin -- User wants "fill-first" (exhaust first key before next) for cost optimization -- Affects custom OpenAI-compatible and Anthropic-compatible providers - -## 🎯 Refined Feature Description - -Extend the provider connection management to allow per-provider API key routing strategy selection, mirroring the 13 strategies already available at the combo level. - -### What it solves - -- Users with multiple API keys for the same provider cannot control which key is used first -- Round-robin wastes quota evenly across keys instead of exhausting free/cheaper tiers first -- No parity between combo-level routing flexibility and provider-level key management - -### How it should work (high level) - -1. Add a "Key Routing Strategy" dropdown to the provider detail page's connection/key management popup -2. Support at minimum: `round-robin`, `priority`, `fill-first`, `random` -3. Store the per-provider strategy in the `provider_connections` table or a new column -4. The combo routing engine respects per-provider key strategy when dispatching requests - -### Affected areas - -- `open-sse/services/combo.ts` — key selection within a provider target -- `src/lib/db/providers.ts` — store per-provider key strategy -- `src/app/(dashboard)/dashboard/providers/[id]/page.tsx` — UI for strategy selection -- `src/shared/validation/schemas.ts` — new schema for provider key strategy - -## 📎 Attachments & References - -- Screenshot of API key popup: https://github.com/user-attachments/assets/d26049ba-0dba-4c64-8ed4-8f68e8c00252 - -## 🔗 Related Ideas - -- Related to combo routing engine strategies in `open-sse/services/combo.ts` diff --git a/docs/i18n/zh-CN/_ideia/defer/785-task-class-routing.md b/docs/i18n/zh-CN/_ideia/defer/785-task-class-routing.md deleted file mode 100644 index 5650b371ab..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/785-task-class-routing.md +++ /dev/null @@ -1,41 +0,0 @@ -# Feature: Task-Class Routing with Escalation/De-escalation (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/785-task-class-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/785-task-class-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/785-task-class-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/785-task-class-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/785-task-class-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/785-task-class-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/785-task-class-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/785-task-class-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/785-task-class-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/785-task-class-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/785-task-class-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/785-task-class-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/785-task-class-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/785-task-class-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/785-task-class-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/785-task-class-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/785-task-class-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/785-task-class-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/785-task-class-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/785-task-class-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/785-task-class-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/785-task-class-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/785-task-class-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/785-task-class-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/785-task-class-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/785-task-class-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/785-task-class-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/785-task-class-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/785-task-class-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/785-task-class-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/785-task-class-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/785-task-class-routing.md) - ---- - -> GitHub Issue: #785 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Map incoming requests to specialized combos based on 7 task classes (bulk_low_risk, code_generation, security_critical, etc.) with automatic escalation to premium models for complex tasks and de-escalation to economy for simple ones. - -## 🎯 Refined Feature Description - -OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` that provide basic task-aware routing. This request expands that with a formal escalation/de-escalation engine based on task classification. - -### What it solves - -- Same combo used for trivial and critical tasks -- No automatic quality scaling based on difficulty - -### How it should work - -1. Classify incoming request into a task class (using existing `intentClassifier`) -2. Map task class → combo selection rules (which combo, which strategy) -3. Apply escalation rules (complex request → premium model) -4. Apply de-escalation (trivial → cheap model) - -### Affected areas - -- `open-sse/services/taskAwareRouter.ts` — extend classification -- `open-sse/services/intentClassifier.ts` — more task classes -- `open-sse/services/combo.ts` — task-class routing integration -- Settings UI — task-class configuration - -## 🔗 Related Ideas - -- Related to [980-lkgp-routing](./980-lkgp-routing.md) — LKGP scoring -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) — dynamic combos -- Part of @igormorais123's series diff --git a/docs/i18n/zh-CN/_ideia/defer/787-auto-research.md b/docs/i18n/zh-CN/_ideia/defer/787-auto-research.md deleted file mode 100644 index 5378cfa133..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/787-auto-research.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: AutoResearch — Recursive Self-Improvement Loop (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/787-auto-research.md) · 🇪🇸 [es](../../../es/_ideia/defer/787-auto-research.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/787-auto-research.md) · 🇩🇪 [de](../../../de/_ideia/defer/787-auto-research.md) · 🇮🇹 [it](../../../it/_ideia/defer/787-auto-research.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/787-auto-research.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/787-auto-research.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/787-auto-research.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/787-auto-research.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/787-auto-research.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/787-auto-research.md) · 🇮🇳 [in](../../../in/_ideia/defer/787-auto-research.md) · 🇹🇭 [th](../../../th/_ideia/defer/787-auto-research.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/787-auto-research.md) · 🇮🇩 [id](../../../id/_ideia/defer/787-auto-research.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/787-auto-research.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/787-auto-research.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/787-auto-research.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/787-auto-research.md) · 🇳🇴 [no](../../../no/_ideia/defer/787-auto-research.md) · 🇩🇰 [da](../../../da/_ideia/defer/787-auto-research.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/787-auto-research.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/787-auto-research.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/787-auto-research.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/787-auto-research.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/787-auto-research.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/787-auto-research.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/787-auto-research.md) · 🇮🇱 [he](../../../he/_ideia/defer/787-auto-research.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/787-auto-research.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/787-auto-research.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/787-auto-research.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/787-auto-research.md) - ---- - -> GitHub Issue: #787 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Implement an autonomous optimization loop where an AI agent iterates hundreds of routing configurations against evaluation datasets, inspired by Karpathy's AutoResearch paradigm. - -## 🎯 Refined Feature Description - -An ambitious research-grade feature that would require significant infrastructure (evaluation datasets, automated benchmarking, config mutation engine). Beyond current scope but catalogs a valid long-term vision. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md) diff --git a/docs/i18n/zh-CN/_ideia/defer/792-team-of-rivals.md b/docs/i18n/zh-CN/_ideia/defer/792-team-of-rivals.md deleted file mode 100644 index b28f955a5f..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/792-team-of-rivals.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Multi-Provider Code Review Pipeline (Team of Rivals) (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/792-team-of-rivals.md) · 🇪🇸 [es](../../../es/_ideia/defer/792-team-of-rivals.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/792-team-of-rivals.md) · 🇩🇪 [de](../../../de/_ideia/defer/792-team-of-rivals.md) · 🇮🇹 [it](../../../it/_ideia/defer/792-team-of-rivals.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/792-team-of-rivals.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/792-team-of-rivals.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/792-team-of-rivals.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/792-team-of-rivals.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/792-team-of-rivals.md) · 🇮🇳 [in](../../../in/_ideia/defer/792-team-of-rivals.md) · 🇹🇭 [th](../../../th/_ideia/defer/792-team-of-rivals.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/792-team-of-rivals.md) · 🇮🇩 [id](../../../id/_ideia/defer/792-team-of-rivals.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/792-team-of-rivals.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/792-team-of-rivals.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/792-team-of-rivals.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/792-team-of-rivals.md) · 🇳🇴 [no](../../../no/_ideia/defer/792-team-of-rivals.md) · 🇩🇰 [da](../../../da/_ideia/defer/792-team-of-rivals.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/792-team-of-rivals.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/792-team-of-rivals.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/792-team-of-rivals.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/792-team-of-rivals.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/792-team-of-rivals.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/792-team-of-rivals.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/792-team-of-rivals.md) · 🇮🇱 [he](../../../he/_ideia/defer/792-team-of-rivals.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/792-team-of-rivals.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/792-team-of-rivals.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/792-team-of-rivals.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/792-team-of-rivals.md) - ---- - -> GitHub Issue: #792 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Send critical tasks to 2-3 providers in parallel (Planner, Critic, Executor, Quality Reviewer), each from different providers for cognitive diversity. - -## 🎯 Refined Feature Description - -Advanced multi-agent orchestration pattern outside OmniRoute's core scope as a proxy/router. Better suited for an orchestration framework built on top of OmniRoute. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [797](./797-hierarchical-router.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/zh-CN/_ideia/defer/797-hierarchical-router.md b/docs/i18n/zh-CN/_ideia/defer/797-hierarchical-router.md deleted file mode 100644 index eeeb508e6b..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/797-hierarchical-router.md +++ /dev/null @@ -1,20 +0,0 @@ -# Feature: Hierarchical Router — Direct vs Multi-Agent orchestration (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/797-hierarchical-router.md) · 🇪🇸 [es](../../../es/_ideia/defer/797-hierarchical-router.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/797-hierarchical-router.md) · 🇩🇪 [de](../../../de/_ideia/defer/797-hierarchical-router.md) · 🇮🇹 [it](../../../it/_ideia/defer/797-hierarchical-router.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/797-hierarchical-router.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/797-hierarchical-router.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/797-hierarchical-router.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/797-hierarchical-router.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/797-hierarchical-router.md) · 🇮🇳 [in](../../../in/_ideia/defer/797-hierarchical-router.md) · 🇹🇭 [th](../../../th/_ideia/defer/797-hierarchical-router.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/797-hierarchical-router.md) · 🇮🇩 [id](../../../id/_ideia/defer/797-hierarchical-router.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/797-hierarchical-router.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/797-hierarchical-router.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/797-hierarchical-router.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/797-hierarchical-router.md) · 🇳🇴 [no](../../../no/_ideia/defer/797-hierarchical-router.md) · 🇩🇰 [da](../../../da/_ideia/defer/797-hierarchical-router.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/797-hierarchical-router.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/797-hierarchical-router.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/797-hierarchical-router.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/797-hierarchical-router.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/797-hierarchical-router.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/797-hierarchical-router.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/797-hierarchical-router.md) · 🇮🇱 [he](../../../he/_ideia/defer/797-hierarchical-router.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/797-hierarchical-router.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/797-hierarchical-router.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/797-hierarchical-router.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/797-hierarchical-router.md) - ---- - -> GitHub Issue: #797 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Two-tier routing layer classifying requests into fast direct path (single model) or multi-agent orchestration (planner → critic → executor). - -## 🎯 Refined Feature Description - -This is an advanced orchestration concept that goes well beyond OmniRoute's scope as a proxy/router. OmniRoute already has `taskAwareRouter.ts` and `intentClassifier.ts` which provide basic task-aware routing, but full multi-agent orchestration is an application-layer concern. - -## 🔗 Related Ideas - -- Part of @igormorais123's series: [792](./792-team-of-rivals.md), [801](./801-cross-provider-diversity.md), [785](./785-task-class-routing.md), [787](./787-auto-research.md) diff --git a/docs/i18n/zh-CN/_ideia/defer/801-cross-provider-diversity.md b/docs/i18n/zh-CN/_ideia/defer/801-cross-provider-diversity.md deleted file mode 100644 index 06344cfccc..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/801-cross-provider-diversity.md +++ /dev/null @@ -1,27 +0,0 @@ -# Feature: Cross-Provider Cognitive Diversity (Role-to-Provider Mapping) (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/801-cross-provider-diversity.md) · 🇪🇸 [es](../../../es/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇪 [de](../../../de/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇹 [it](../../../it/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/801-cross-provider-diversity.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/801-cross-provider-diversity.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇳 [in](../../../in/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇭 [th](../../../th/_ideia/defer/801-cross-provider-diversity.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇩 [id](../../../id/_ideia/defer/801-cross-provider-diversity.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/801-cross-provider-diversity.md) · 🇳🇴 [no](../../../no/_ideia/defer/801-cross-provider-diversity.md) · 🇩🇰 [da](../../../da/_ideia/defer/801-cross-provider-diversity.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/801-cross-provider-diversity.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/801-cross-provider-diversity.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/801-cross-provider-diversity.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/801-cross-provider-diversity.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/801-cross-provider-diversity.md) · 🇮🇱 [he](../../../he/_ideia/defer/801-cross-provider-diversity.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/801-cross-provider-diversity.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/801-cross-provider-diversity.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/801-cross-provider-diversity.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/801-cross-provider-diversity.md) - ---- - -> GitHub Issue: #801 — opened by @igormorais123 on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -Enforce that different roles in multi-model review pipelines use different providers to maximize failure diversity. A planner and its critic should never be the same provider. - -## 🎯 Refined Feature Description - -This is an advanced orchestration pattern. OmniRoute already supports multi-provider combos but doesn't enforce cognitive diversity between roles. This would require significant architectural changes to add role-based routing. - -### Affected areas - -- Would require a new orchestration layer above combo routing -- Significant scope for a routing proxy - -## 🔗 Related Ideas - -- Related to [792-team-of-rivals](./792-team-of-rivals.md) -- Related to [797-hierarchical-router](./797-hierarchical-router.md) -- Part of @igormorais123's 5-issue series (#785, #787, #792, #797, #801) diff --git a/docs/i18n/zh-CN/_ideia/defer/980-lkgp-routing.md b/docs/i18n/zh-CN/_ideia/defer/980-lkgp-routing.md deleted file mode 100644 index ec6264b0e7..0000000000 --- a/docs/i18n/zh-CN/_ideia/defer/980-lkgp-routing.md +++ /dev/null @@ -1,47 +0,0 @@ -# Feature: LKGP (Last Known Good Providers) Routing (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/defer/980-lkgp-routing.md) · 🇪🇸 [es](../../../es/_ideia/defer/980-lkgp-routing.md) · 🇫🇷 [fr](../../../fr/_ideia/defer/980-lkgp-routing.md) · 🇩🇪 [de](../../../de/_ideia/defer/980-lkgp-routing.md) · 🇮🇹 [it](../../../it/_ideia/defer/980-lkgp-routing.md) · 🇷🇺 [ru](../../../ru/_ideia/defer/980-lkgp-routing.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/defer/980-lkgp-routing.md) · 🇯🇵 [ja](../../../ja/_ideia/defer/980-lkgp-routing.md) · 🇰🇷 [ko](../../../ko/_ideia/defer/980-lkgp-routing.md) · 🇸🇦 [ar](../../../ar/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [hi](../../../hi/_ideia/defer/980-lkgp-routing.md) · 🇮🇳 [in](../../../in/_ideia/defer/980-lkgp-routing.md) · 🇹🇭 [th](../../../th/_ideia/defer/980-lkgp-routing.md) · 🇻🇳 [vi](../../../vi/_ideia/defer/980-lkgp-routing.md) · 🇮🇩 [id](../../../id/_ideia/defer/980-lkgp-routing.md) · 🇲🇾 [ms](../../../ms/_ideia/defer/980-lkgp-routing.md) · 🇳🇱 [nl](../../../nl/_ideia/defer/980-lkgp-routing.md) · 🇵🇱 [pl](../../../pl/_ideia/defer/980-lkgp-routing.md) · 🇸🇪 [sv](../../../sv/_ideia/defer/980-lkgp-routing.md) · 🇳🇴 [no](../../../no/_ideia/defer/980-lkgp-routing.md) · 🇩🇰 [da](../../../da/_ideia/defer/980-lkgp-routing.md) · 🇫🇮 [fi](../../../fi/_ideia/defer/980-lkgp-routing.md) · 🇵🇹 [pt](../../../pt/_ideia/defer/980-lkgp-routing.md) · 🇷🇴 [ro](../../../ro/_ideia/defer/980-lkgp-routing.md) · 🇭🇺 [hu](../../../hu/_ideia/defer/980-lkgp-routing.md) · 🇧🇬 [bg](../../../bg/_ideia/defer/980-lkgp-routing.md) · 🇸🇰 [sk](../../../sk/_ideia/defer/980-lkgp-routing.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/defer/980-lkgp-routing.md) · 🇮🇱 [he](../../../he/_ideia/defer/980-lkgp-routing.md) · 🇵🇭 [phi](../../../phi/_ideia/defer/980-lkgp-routing.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/defer/980-lkgp-routing.md) · 🇨🇿 [cs](../../../cs/_ideia/defer/980-lkgp-routing.md) · 🇹🇷 [tr](../../../tr/_ideia/defer/980-lkgp-routing.md) - ---- - -> GitHub Issue: #980 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 919 by @oyi77 - -## 📝 Original Request - -Implement a dynamic weighting algorithm in the combo routing engine that uses latency and recent success rate (LKGP) alongside healthchecks. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @oyi77 — Original discussion author - -## 🎯 Refined Feature Description - -LKGP routing tracks which provider connections have been performing well recently (low latency, high success rate) and dynamically adjusts routing weights to prefer them. Unlike static priority, this adapts in real-time. - -### What it solves - -- Static priority can't adapt to transient provider degradation -- Healthchecks are periodic — LKGP uses real request metrics - -### How it should work - -1. Track last N request outcomes per connection (success/fail, latency) -2. Compute a LKGP score = f(success_rate, avg_latency, recency) -3. Use LKGP scores as dynamic weights in combo routing -4. Decay old metrics over time - -### Affected areas - -- `open-sse/services/combo.ts` — routing weight calculation -- `src/lib/db/domainState.ts` — LKGP metric storage -- Dashboard — LKGP score visualization - -## 🔗 Related Ideas - -- Related to [1041-smart-auto-combos](./1041-smart-auto-combos.md) -- Related to [785-task-class-routing](./785-task-class-routing.md) diff --git a/docs/i18n/zh-CN/_ideia/notfit/1023-providers-independent.md b/docs/i18n/zh-CN/_ideia/notfit/1023-providers-independent.md deleted file mode 100644 index d972464807..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1023-providers-independent.md +++ /dev/null @@ -1,43 +0,0 @@ -# Feature: Providers-independent approach (Universal Model IDs) (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1023-providers-independent.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1023-providers-independent.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1023-providers-independent.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1023-providers-independent.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1023-providers-independent.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1023-providers-independent.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1023-providers-independent.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1023-providers-independent.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1023-providers-independent.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1023-providers-independent.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1023-providers-independent.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1023-providers-independent.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1023-providers-independent.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1023-providers-independent.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1023-providers-independent.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1023-providers-independent.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1023-providers-independent.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1023-providers-independent.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1023-providers-independent.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1023-providers-independent.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1023-providers-independent.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1023-providers-independent.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1023-providers-independent.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1023-providers-independent.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1023-providers-independent.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1023-providers-independent.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1023-providers-independent.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1023-providers-independent.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1023-providers-independent.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1023-providers-independent.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1023-providers-independent.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1023-providers-independent.md) - ---- - -> GitHub Issue: #1023 — opened by @ralphilius on 2026-04-06 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -When connecting to multiple providers that serve the same models, users need to switch prefixes in coding tool configs. Proposes universal constant model IDs that work regardless of provider, making OmniRoute appear as a single provider. - -## 💬 Community Discussion - -### Participants - -- @ralphilius — Original requester - -### Key Points - -- Pain point: switching provider prefixes in client configs when rotating providers -- Wants "set and forget" configuration - -## 🎯 Refined Feature Description - -This is essentially the model alias system that already exists. Users can create aliases like `claude-sonnet` → `anthropic/claude-sonnet-4` so their clients always use the same model name regardless of which provider serves it. - -### What it solves - -- Already solved by existing Model Aliases feature (`/dashboard/settings` → Model Aliases) - -### Affected areas - -- May need better documentation/discoverability of existing aliases feature - -## 📎 Attachments & References - -- Existing feature: Model Aliases in dashboard settings - -## 🔗 Related Ideas - -- This overlaps with existing Model Aliases functionality — may just need documentation/UI improvements diff --git a/docs/i18n/zh-CN/_ideia/notfit/1046-native-playground.md b/docs/i18n/zh-CN/_ideia/notfit/1046-native-playground.md deleted file mode 100644 index 7f0abb28b0..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1046-native-playground.md +++ /dev/null @@ -1,80 +0,0 @@ -# Feature: Native Playground LLM Dashboard - Built-in testing page (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1046-native-playground.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1046-native-playground.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1046-native-playground.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1046-native-playground.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1046-native-playground.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1046-native-playground.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1046-native-playground.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1046-native-playground.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1046-native-playground.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1046-native-playground.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1046-native-playground.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1046-native-playground.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1046-native-playground.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1046-native-playground.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1046-native-playground.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1046-native-playground.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1046-native-playground.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1046-native-playground.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1046-native-playground.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1046-native-playground.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1046-native-playground.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1046-native-playground.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1046-native-playground.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1046-native-playground.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1046-native-playground.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1046-native-playground.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1046-native-playground.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1046-native-playground.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1046-native-playground.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1046-native-playground.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1046-native-playground.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1046-native-playground.md) - ---- - -> GitHub Issue: #1046 — opened by @diegosouzapw on 2026-04-07 -> Status: 📋 Cataloged | Priority: High -> Duplicate of: #234 (92% similarity per Kilo) - -## 📝 Original Request - -**Source:** Discussion #1035 by @rilham97 - -Add a built-in playground or test page in the OmniRoute dashboard where users can easily test their configured LLMs, verify model names, and check the response body formatting directly. - -### Implementation Ideas - -- A lightweight React component in the `/dashboard` route. -- A simple chat or raw completion interface to send test requests to the OmniRoute proxy endpoint. - -### Current Workarounds - -Users can use lightweight local clients like OpenClaw, or standard terminal/browser curl requests to test the API. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator (from discussion) -- @rilham97 — Original requester, provided design references -- @kilo-code-bot — Auto-triage (duplicate of #234, 92%) - -### Key Points - -- This is a highly requested feature with a prior duplicate (#234) -- @rilham97 provided concrete UI references: - - https://app.fireworks.ai/playground - - https://ai.nahcrof.com/ - -## 🎯 Refined Feature Description - -A built-in playground page at `/dashboard/playground` that allows users to: - -1. Select any configured combo or provider+model -2. Send chat completion requests with customizable parameters (temperature, max_tokens, system prompt) -3. View full response including metadata (tokens used, latency, cost) -4. Toggle between streaming and non-streaming modes -5. View raw request/response JSON for debugging - -### What it solves - -- Eliminates need for external tools to test model configuration -- Provides instant feedback on whether a combo/provider is working -- Helps debug response format issues without leaving the dashboard - -### How it should work (high level) - -1. User navigates to `/dashboard/playground` -2. Selects a combo or specific provider/model from dropdown -3. Types a message in a chat interface -4. Clicks Send → sees streaming response -5. Can inspect raw JSON, token usage, and latency metrics - -### Affected areas - -- `src/app/(dashboard)/dashboard/playground/` — new page -- `src/app/api/` — may use existing `/v1/chat/completions` internally -- i18n — new translation keys across 30 languages -- Sidebar navigation — add new menu item - -## 📎 Attachments & References - -- Fireworks AI Playground: https://app.fireworks.ai/playground -- AI Nahcrof playground: https://ai.nahcrof.com/ -- Original discussion: #1035 - -## 🔗 Related Ideas - -- Related to #234 (original playground request, 92% similarity) diff --git a/docs/i18n/zh-CN/_ideia/notfit/1100-headroom-support.md b/docs/i18n/zh-CN/_ideia/notfit/1100-headroom-support.md deleted file mode 100644 index ba72c8854c..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1100-headroom-support.md +++ /dev/null @@ -1,61 +0,0 @@ -# Feature: [Feature] Headroom support (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1100-headroom-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1100-headroom-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1100-headroom-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1100-headroom-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1100-headroom-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1100-headroom-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1100-headroom-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1100-headroom-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1100-headroom-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1100-headroom-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1100-headroom-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1100-headroom-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1100-headroom-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1100-headroom-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1100-headroom-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1100-headroom-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1100-headroom-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1100-headroom-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1100-headroom-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1100-headroom-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1100-headroom-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1100-headroom-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1100-headroom-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1100-headroom-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1100-headroom-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1100-headroom-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1100-headroom-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1100-headroom-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1100-headroom-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1100-headroom-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1100-headroom-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1100-headroom-support.md) - ---- - -> GitHub Issue: #1100 — opened by @mkizilov on 2026-04-10T00:15:46Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Right now there is problematic to running Headroom because it needs to be routed via omniroute. Maybe implement some easier way to do it? - -https://github.com/chopratejas/headroom - -### Proposed Solution - -https://github.com/chopratejas/headroom - -### Acceptance Criteria - -some turn on\off switch to use headroom right in the UI - -### Area - -Proxy / Routing - -## 💬 Community Discussion - -(No comments yet) - -## 🎯 Refined Feature Description - -Headroom is an open-source UI for interacting with LLMs. The user wants to integrate/run Headroom directly through OmniRoute's UI with a simple switch, rather than having to separately deploy and configure Headroom to route traffic through OmniRoute. - -### What it solves - -- Removes the deployment friction for using a chat UI (Headroom) with our local API endpoints. -- Unifies the experience within our dashboard. - -### How it should work (high level) - -1. Add an internal proxy or embedding layer for Headroom's static UI. -2. In the OmniRoute dashboard, provide a switch or dedicated "Chat UI" route to launch headroom. -3. Auto-configure the Headroom UI to use `http://localhost:20128/v1` and the user's OmniRoute APIs automatically. - -### Affected areas - -- `src/app/(dashboard)/` -- `open-sse/services/` -- Next.js rewrite/proxy configs or Docker compose templates. - -## 📎 Attachments & References - -- https://github.com/chopratejas/headroom - -## 🔗 Related Ideas - -- 1046-native-playground (already implemented a native playground, which might solve their primary need) diff --git a/docs/i18n/zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md b/docs/i18n/zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md deleted file mode 100644 index ea6a6529e0..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md +++ /dev/null @@ -1,65 +0,0 @@ -# Feature: [Feature] whitelist models for specific API KEY (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1110-whitelist-models-api-key.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1110-whitelist-models-api-key.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1110-whitelist-models-api-key.md) - ---- - -> GitHub Issue: #1110 — opened by @0xtbug on 2026-04-10T09:26:02Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -For better API KEY management, the system needs to support a customized model list (whitelist) for specific API KEYs. This is crucial for access control, cost limitation, and offering tiered services. - -For example: - -- api_key_1 (Admin/Pro): can access all models (\*). -- api_key_2 (Basic): can only access specific, perhaps cheaper, models like gpt-3.5-turbo, claude-3-haiku. -- api_key_3 (Vendor): can access all models from a specific provider alongside specific extra models (e.g., anthropic/\*, model_extra_1). - -### Proposed Solution - -1. Data Schema Update: Add a new optional property (e.g., allowed_models as an array of strings) to the API Key database/schema. Support wildcards or provider namespaces (e.g., _, openai/_, gpt-4). -2. Middleware / Validation Logic: Modify the authentication middleware. After validating the API Key, intercept the request payload to check if the requested model is within the key's allowed list. -3. Interception: If the requested model is not in the API Key's whitelist, reject the request with a 403 Forbidden status and a clear error message (e.g., "Model not allowed for this API key"). -4. Admin Dashboard (If UI exists): Add a multi-select dropdown in the API Key creation interface so admins can easily configure permitted models for the new key. - -### Alternatives Considered - -- Using a Separate Reverse Proxy (API Gateway). Drawback: Adds infrastructure complexity. -- Deploying Different Instances. Drawback: Highly resource-intensive. - -### Acceptance Criteria - -- API keys with \* access (or no restrictions) can successfully call all available models (200 OK). -- API keys attempting to call unsupported models are rejected with 403 Forbidden. -- Support wildcard parsing logic (`openai/*`). -- No significant performance latency. - -## 💬 Community Discussion - -- @kilo-code-bot — Triaged this issue as a duplicate of #781 (Similarity score: 90%). Tagged `kilo-duplicate`. - -## 🎯 Refined Feature Description - -Allow administrators to restrict which specific models/combos an OmniRoute API Key can invoke. Currently, an OmniRoute key grants access to all configured combos. This feature would restrict that access at the routing layer (`chatCore.ts` or auth middleware). - -### What it solves - -Allows the creation of "cheap" keys for casual tools and "expensive" keys for priority workflows. - -### Affected areas - -- `src/lib/db/apiKeys.ts` -- `open-sse/handlers/chatCore.ts` (or the Auth plugin) -- Dashboard `ApiKeysView.tsx` - -## 📎 Attachments & References - -N/A - -## 🔗 Related Ideas - -> ℹ️ This feature is a duplicate of #781. Consider marking it as ALREADY EXISTS or NOT FIT depending on #781 status. diff --git a/docs/i18n/zh-CN/_ideia/notfit/1129-automated-hermes.md b/docs/i18n/zh-CN/_ideia/notfit/1129-automated-hermes.md deleted file mode 100644 index 6acbbd6bc2..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1129-automated-hermes.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Automated installation for Hermes (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1129-automated-hermes.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1129-automated-hermes.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1129-automated-hermes.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1129-automated-hermes.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1129-automated-hermes.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1129-automated-hermes.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1129-automated-hermes.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1129-automated-hermes.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1129-automated-hermes.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1129-automated-hermes.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1129-automated-hermes.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1129-automated-hermes.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1129-automated-hermes.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1129-automated-hermes.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1129-automated-hermes.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1129-automated-hermes.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1129-automated-hermes.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1129-automated-hermes.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1129-automated-hermes.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1129-automated-hermes.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1129-automated-hermes.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1129-automated-hermes.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1129-automated-hermes.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1129-automated-hermes.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1129-automated-hermes.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1129-automated-hermes.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1129-automated-hermes.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1129-automated-hermes.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1129-automated-hermes.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1129-automated-hermes.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1129-automated-hermes.md) - ---- - -> GitHub Issue: #1129 — opened by @Snodgrass-Wilkerschnoz on 2026-04-10 -> Status: ❌ NOT FIT | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -I’d like to simply configure Hermes to work with OmniRoute with an Hermes-led step-through configuration to simplify onboarding and avoid manual config. - -### Proposed Solution - -Step-though initial config for Hermes. - -### Acceptance Criteria - --Direct Hermes to install OmniRoute --After installation, Hermes walks through config --Configuration is written to OmniRoute and can be controlled successfully by Hermes - -## 💬 Community Discussion - -### Participants - -- @Snodgrass-Wilkerschnoz — Original requester - -## 🎯 Refined Feature Description - -Create an automated deployment script inside the Hermes Agent configuration wizard to download, install, and interface with OmniRoute. - -### Why it does not fit - -Hermes Agent is a completely separate application that utilizes APIs. Any installer logic dictating "Hermes walks through config" would technically reside exclusively inside the Hermes Agent repository's source code, not inside the OmniRoute proxy itself. Expanding the OmniRoute proxy engine to package installation routines for external autonomous agents violates OmniRoute's architectural boundaries as a headless unified proxy wrapper. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/zh-CN/_ideia/notfit/1132-venice-ai-provider.md b/docs/i18n/zh-CN/_ideia/notfit/1132-venice-ai-provider.md deleted file mode 100644 index 8688e08a9e..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1132-venice-ai-provider.md +++ /dev/null @@ -1,40 +0,0 @@ -# Feature: [Feature] venice.ai inference provider (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1132-venice-ai-provider.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1132-venice-ai-provider.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1132-venice-ai-provider.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1132-venice-ai-provider.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1132-venice-ai-provider.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1132-venice-ai-provider.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1132-venice-ai-provider.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1132-venice-ai-provider.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1132-venice-ai-provider.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1132-venice-ai-provider.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1132-venice-ai-provider.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1132-venice-ai-provider.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1132-venice-ai-provider.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1132-venice-ai-provider.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1132-venice-ai-provider.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1132-venice-ai-provider.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1132-venice-ai-provider.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1132-venice-ai-provider.md) - ---- - -> GitHub Issue: #1132 — opened by @neurocis on 2026-04-11 -> Status: 🔁 EXISTS | Priority: None - -## 📝 Original Request - -### Problem / Use Case - -Please add an OpenAI compatible Inference provider as 1st class citizen (venice.ai) - -### Proposed Solution - -Please add venice.ai as a 1st class AI Inference provider. - -### Acceptance Criteria - -API endpoint: https://api.venice.ai/api/v1 - -## 💬 Community Discussion - -### Participants - -- @neurocis — Original requester - -## 🎯 Refined Feature Description - -Add native proxy support and UI configuration mapping for the Venice AI inference network. - -### Why it already exists - -This specific provider endpoint implementation `https://api.venice.ai/api/v1` and configuration was completely fulfilled in an earlier version cycle during our ecosystem adoption of 60+ upstream target definitions. Venice AI is already registered and can be configured normally through the Provider Dashboard. - -## 🔗 Related Ideas - -- N/A diff --git a/docs/i18n/zh-CN/_ideia/notfit/1191-filter-custom-model.md b/docs/i18n/zh-CN/_ideia/notfit/1191-filter-custom-model.md deleted file mode 100644 index 1a2f494631..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1191-filter-custom-model.md +++ /dev/null @@ -1,39 +0,0 @@ -# Feature: Filter for Custom Model (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1191-filter-custom-model.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1191-filter-custom-model.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1191-filter-custom-model.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1191-filter-custom-model.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1191-filter-custom-model.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1191-filter-custom-model.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1191-filter-custom-model.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1191-filter-custom-model.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1191-filter-custom-model.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1191-filter-custom-model.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1191-filter-custom-model.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1191-filter-custom-model.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1191-filter-custom-model.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1191-filter-custom-model.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1191-filter-custom-model.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1191-filter-custom-model.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1191-filter-custom-model.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1191-filter-custom-model.md) - ---- - -> GitHub Issue: #1191 — opened by @tjengbudi on 2026-04-13 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user requests a filter/search functionality for custom models in the provider detail page, to help find specific models in large catalogs. - -## 💬 Community Discussion - -### Participants - -- @tjengbudi — Original requester -- 2 comments in discussion thread - -### Key Points - -- User may not have discovered the existing filter functionality -- The model filter bar may not be sufficiently visible on the page - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -**Location:** Provider Detail Page (`/dashboard/providers/`) → Models section - -**How it works:** - -1. Navigate to Dashboard → Providers → click on any provider -2. Scroll down to the Models section -3. The search/filter input at the top of the model list filters by name, ID, and aliases -4. Implementation: `modelFilter` state (line 989 in `page.tsx`) with `matchesModelCatalogQuery()` function - -The filter supports searching by model name, model ID, and configured aliases. It works for both built-in and custom models. diff --git a/docs/i18n/zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md b/docs/i18n/zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md deleted file mode 100644 index 712fc998b6..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: [Feature] gpt-image-1 and gpt-iamge-1.5 support (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1195-feature-gpt-image-1-and-gpt-iamge-1-5-support.md) - ---- - -> GitHub Issue: #1195 — opened by @cryptiklemur on 2026-04-13T04:51:30Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -Image generation should support gpt-image-x models - -### Proposed Solution - -Image generation should support gpt-image-x models - -### Alternatives Considered - -_No response_ - -### Acceptance Criteria - -Can select gpt-image-1 or 1.5 - -### Area - -Provider Support - -### Related Provider(s) - -OpenAI - -### Additional Context - -_No response_ - -### Expected Test Plan - -_No response_ - -## 💬 Community Discussion - -- @kilo-code-bot: This issue appears to be a duplicate of https://github.com/diegosouzapw/OmniRoute/issues/973. - -> **Support for Image Generation with Custom OpenAI-Compatible Providers** (#973) - -Similarity score: 91% -... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md b/docs/i18n/zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md deleted file mode 100644 index 9f71891056..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md +++ /dev/null @@ -1,93 +0,0 @@ -# Feature: [Feature] Add configurable stagger delay between token health check sweep iterations (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1220-feature-add-configurable-stagger-delay-between-token-health-check-sweep-iterations.md) - ---- - -> GitHub Issue: #1220 — opened by @edwardsconnects90 on 2026-04-13T16:43:19Z -> Status: 📋 Cataloged | Priority: TBD - -## 📝 Original Request - -### Problem / Use Case - -The proactive token health check sweep iterates all OAuth connections sequentially but with **no delay** between iterations. When running with multiple SOCKS5 proxies (one per account), all proxy connections are initiated in rapid succession — effectively simultaneously from the proxy perspective. This causes proxy overload, connection timeouts, and failed token refreshes across all accounts in the same sweep cycle. - -With multiple dedicated SOCKS5 proxies, the sweep fires all connections within milliseconds. Logs show all "Refreshing ..." entries appearing in a burst (<100ms total for all accounts). - -### Proposed Solution - -Add a configurable stagger delay after each iteration of the sweep loop in `tokenHealthCheck.ts`, controlled by a `HEALTHCHECK_STAGGER_MS` environment variable (default: `3000` ms). When set to `0`, staggering is disabled. - -The implementation is a single `await new Promise(resolve => setTimeout(resolve, STAGGER_MS))` at the end of each loop iteration inside the sweep function. - -| Variable | Default | Description | -| ------------------------ | ------- | ----------------------------------------------------------------------------------------------- | -| `HEALTHCHECK_STAGGER_MS` | `3000` | Delay in milliseconds between consecutive token health check iterations. Set to `0` to disable. | - -With the stagger in place, inter-iteration gaps become ~3-7s (configured stagger + proxy round-trip time), confirming that connections no longer pile up simultaneously. - -### Alternatives Considered - -- **Client-side rate limiting per proxy:** More complex, requires tracking per-proxy concurrency. The stagger approach is simpler and sufficient for the sequential sweep loop. -- **Parallel sweep with concurrency limit:** Would require rewriting the sweep loop to use a worker pool. Overkill for the current use case where sequential + stagger is adequate. - -### Acceptance Criteria - -- Health check sweep has a configurable delay between iterations via `HEALTHCHECK_STAGGER_MS` env variable -- Default delay is 3000ms -- Setting to 0 disables the stagger -- Consecutive "Refreshing ..." log entries are spaced by at least `HEALTHCHECK_STAGGER_MS` milliseconds -- All existing health check functionality remains unchanged - -### Area - -Proxy / Routing - -### Related Provider(s) - -Codex (OpenAI) — affects all OAuth providers when multiple connections use dedicated SOCKS5 proxies - -### Additional Context - -- **Impact without fix:** All proxy connections open simultaneously → proxy overload → universal token refresh failure each sweep cycle -- **Impact with fix:** Connections spread over `N x STAGGER_MS` total sweep duration → each proxy gets exclusive window → reliable token refreshes -- Total sweep duration increases proportionally (e.g. 10 connections x 3s = ~30s minimum), which is acceptable given sweeps run on intervals of minutes to hours -- **Optional UI enhancement:** Settings panel could expose `HEALTHCHECK_STAGGER_MS` as a numeric input under Provider Health Check settings -- Current workaround: build-time patch (`patch-stagger-healthcheck.cjs`) injects `setTimeout` delay into compiled webpack chunks - -### Expected Test Plan - -- Add unit test for sweep loop verifying inter-iteration delay when `HEALTHCHECK_STAGGER_MS > 0` -- Add unit test verifying no delay when `HEALTHCHECK_STAGGER_MS=0` -- Integration test: run sweep with multiple connections, verify log timestamps show expected stagger spacing - -## 💬 Community Discussion - -- @diegosouzapw: Thanks for the well-thought-out proposal, @edwardsconnects90. The stagger logic is sound. - -We're accepting this as an enhancement. The implementation is straightforward — a configurable `HEALTHCHECK_S... - -## 🎯 Refined Feature Description - -(Requires manual/AI refinement) - -### What it solves - -- TBD - -### How it should work (high level) - -1. TBD - -### Affected areas - -- TBD - -## 📎 Attachments & References - -- TBD - -## 🔗 Related Ideas - -- TBD diff --git a/docs/i18n/zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md b/docs/i18n/zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md deleted file mode 100644 index af440d107a..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md +++ /dev/null @@ -1,35 +0,0 @@ -# Feature: Enforce Passing All Tests / Workflows Before Release (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/1364-enforce-tests-before-release.md) · 🇪🇸 [es](../../../es/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇪 [de](../../../de/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇹 [it](../../../it/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇳 [in](../../../in/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇭 [th](../../../th/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇩 [id](../../../id/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇳🇴 [no](../../../no/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇩🇰 [da](../../../da/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇮🇱 [he](../../../he/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/1364-enforce-tests-before-release.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/1364-enforce-tests-before-release.md) - ---- - -> GitHub Issue: #1364 — opened by @uwuclxdy on 2026-04-17 -> Status: 🔁 ALREADY EXISTS - -## 📝 Original Request - -The user is trying to use the latest version but reports the last two releases (v3.6.6, v3.6.7) were broken. Proposes creating a release workflow or gate that prevents creating a new release until all tests and workflows pass. - -## 💬 Community Discussion - -### Participants - -- @uwuclxdy — Original requester -- @chalitbkb — Linked to #1355 (same CLI issue) - -### Key Points - -- The specific breakage was the CLI entry point shipping as raw TypeScript (`.ts` instead of compiled `.mjs`) -- The test suite itself was passing — the issue was a missing build step in the publishing pipeline -- Community identified this as related to #1355 - -## 🎯 Resolution - -This functionality **already exists** in OmniRoute: - -1. **`/generate-release` workflow** — runs full test suite (`npm run test:all`) before creating any release -2. **Pre-push git hooks** — block pushes if tests fail -3. **lint-staged** — runs prettier + eslint on every commit - -The v3.6.6/v3.6.7 breakage was specifically caused by a missing CLI build step (not a test failure), which has been fixed in v3.6.8 with `bin/omniroute.mjs`. The release pipeline gap has been closed. diff --git a/docs/i18n/zh-CN/_ideia/notfit/804-9router-migration.md b/docs/i18n/zh-CN/_ideia/notfit/804-9router-migration.md deleted file mode 100644 index d4b149663b..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/804-9router-migration.md +++ /dev/null @@ -1,24 +0,0 @@ -# Feature: 9router to OmniRoute migration tool (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/804-9router-migration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/804-9router-migration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/804-9router-migration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/804-9router-migration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/804-9router-migration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/804-9router-migration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/804-9router-migration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/804-9router-migration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/804-9router-migration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/804-9router-migration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/804-9router-migration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/804-9router-migration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/804-9router-migration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/804-9router-migration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/804-9router-migration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/804-9router-migration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/804-9router-migration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/804-9router-migration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/804-9router-migration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/804-9router-migration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/804-9router-migration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/804-9router-migration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/804-9router-migration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/804-9router-migration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/804-9router-migration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/804-9router-migration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/804-9router-migration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/804-9router-migration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/804-9router-migration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/804-9router-migration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/804-9router-migration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/804-9router-migration.md) - ---- - -> GitHub Issue: #804 — opened by @md-riaz on 2026-03-30 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User trying OmniRoute but can't migrate existing 9router setup. Starting OmniRoute replaces 9router directly. - -## 🎯 Refined Feature Description - -A migration utility was **already implemented in v3.5.4** — JSON-based settings import/export for legacy 9router configurations, with security-hardened redaction. - -### What it solves - -- Already solved in v3.5.4 - -## 🔗 Related Ideas - -- None — already implemented diff --git a/docs/i18n/zh-CN/_ideia/notfit/833-termux-android-support.md b/docs/i18n/zh-CN/_ideia/notfit/833-termux-android-support.md deleted file mode 100644 index d185612252..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/833-termux-android-support.md +++ /dev/null @@ -1,55 +0,0 @@ -# Feature: Native Termux (Android/arm64) Support (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/833-termux-android-support.md) · 🇪🇸 [es](../../../es/_ideia/notfit/833-termux-android-support.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/833-termux-android-support.md) · 🇩🇪 [de](../../../de/_ideia/notfit/833-termux-android-support.md) · 🇮🇹 [it](../../../it/_ideia/notfit/833-termux-android-support.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/833-termux-android-support.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/833-termux-android-support.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/833-termux-android-support.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/833-termux-android-support.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/833-termux-android-support.md) · 🇮🇳 [in](../../../in/_ideia/notfit/833-termux-android-support.md) · 🇹🇭 [th](../../../th/_ideia/notfit/833-termux-android-support.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/833-termux-android-support.md) · 🇮🇩 [id](../../../id/_ideia/notfit/833-termux-android-support.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/833-termux-android-support.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/833-termux-android-support.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/833-termux-android-support.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/833-termux-android-support.md) · 🇳🇴 [no](../../../no/_ideia/notfit/833-termux-android-support.md) · 🇩🇰 [da](../../../da/_ideia/notfit/833-termux-android-support.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/833-termux-android-support.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/833-termux-android-support.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/833-termux-android-support.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/833-termux-android-support.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/833-termux-android-support.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/833-termux-android-support.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/833-termux-android-support.md) · 🇮🇱 [he](../../../he/_ideia/notfit/833-termux-android-support.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/833-termux-android-support.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/833-termux-android-support.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/833-termux-android-support.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/833-termux-android-support.md) - ---- - -> GitHub Issue: #833 — opened by @marojiro on 2026-03-30 -> Status: 📋 Cataloged | Priority: Medium -> Duplicate of: #821 (92% similarity per Kilo) - -## 📝 Original Request - -OmniRoute can't run on Termux (Android/arm64) due to three blockers: - -1. **`keytar` fails to compile** on Node 22+ — useless on Android (no system keychain) -2. **`better-sqlite3` missing `binding.gyp`** — bundled binary is x86_64, can't rebuild without sources -3. **`isNativeBinaryCompatible()` rejects Android** — `process.platform` returns "android" but ELF binary is detected as "linux" - -### Proposed Fix for #3 - -```javascript -// Before: -if (target.platform !== runtimePlatform || ... -// After: -if ((target.platform !== runtimePlatform && !(target.platform === "linux" && runtimePlatform === "android")) || ... -``` - -## 💬 Community Discussion - -- @kilo-code-bot flagged duplicate of #821 - -## 🎯 Refined Feature Description - -Three concrete, small changes to unblock Termux users: - -### What it solves - -- OmniRoute unusable on Android devices (Termux) -- Growing mobile developer use case (coding on tablets/phones) - -### How it should work - -1. Make `keytar` optional with try/catch wrapper -2. Ensure `better-sqlite3` can be rebuilt from source on arm64 -3. Treat `android` as equivalent to `linux` in platform checks - -### Affected areas - -- `scripts/native-binary-compat.mjs` — platform check fix (one-liner) -- `package.json` — make keytar optional dependency -- Docker/build — ensure better-sqlite3 sources are included - -## 🔗 Related Ideas - -- Duplicate of #821 — consolidate fixes diff --git a/docs/i18n/zh-CN/_ideia/notfit/907-codex-in-claude-code.md b/docs/i18n/zh-CN/_ideia/notfit/907-codex-in-claude-code.md deleted file mode 100644 index 78bde4aaca..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/907-codex-in-claude-code.md +++ /dev/null @@ -1,38 +0,0 @@ -# Feature: Use Codex GPT models in Claude Code CLI (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/907-codex-in-claude-code.md) · 🇪🇸 [es](../../../es/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇪 [de](../../../de/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇹 [it](../../../it/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/907-codex-in-claude-code.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/907-codex-in-claude-code.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇳 [in](../../../in/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇭 [th](../../../th/_ideia/notfit/907-codex-in-claude-code.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇩 [id](../../../id/_ideia/notfit/907-codex-in-claude-code.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/907-codex-in-claude-code.md) · 🇳🇴 [no](../../../no/_ideia/notfit/907-codex-in-claude-code.md) · 🇩🇰 [da](../../../da/_ideia/notfit/907-codex-in-claude-code.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/907-codex-in-claude-code.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/907-codex-in-claude-code.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/907-codex-in-claude-code.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/907-codex-in-claude-code.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/907-codex-in-claude-code.md) · 🇮🇱 [he](../../../he/_ideia/notfit/907-codex-in-claude-code.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/907-codex-in-claude-code.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/907-codex-in-claude-code.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/907-codex-in-claude-code.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/907-codex-in-claude-code.md) - ---- - -> GitHub Issue: #907 — opened by @tranduykhanh030 on 2026-04-02 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -User asks how to use GPT models in Claude Code CLI through OmniRoute, noting that OmniRoute "doesn't provide an output for Claude Code." - -## 💬 Community Discussion - -- No community comments - -## 🎯 Refined Feature Description - -This is **already a core feature** of OmniRoute. OmniRoute acts as an OpenAI-compatible proxy that Claude Code can connect to, routing requests to any configured provider including Codex/GPT models. - -### What it solves - -- Already solved — this is a documentation/discoverability issue - -### How it works (already) - -1. Configure OmniRoute with Codex/OpenAI credentials -2. Set Claude Code's `ANTHROPIC_BASE_URL` to OmniRoute's endpoint -3. Claude Code sends requests → OmniRoute routes to GPT models - -### Affected areas - -- Documentation improvement needed — better quickstart guide for Claude Code users - -## 🔗 Related Ideas - -- None — existing functionality diff --git a/docs/i18n/zh-CN/_ideia/notfit/945-telegram-integration.md b/docs/i18n/zh-CN/_ideia/notfit/945-telegram-integration.md deleted file mode 100644 index 4f95a54e3f..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/945-telegram-integration.md +++ /dev/null @@ -1,42 +0,0 @@ -# Feature: Telegram Integration (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/945-telegram-integration.md) · 🇪🇸 [es](../../../es/_ideia/notfit/945-telegram-integration.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/945-telegram-integration.md) · 🇩🇪 [de](../../../de/_ideia/notfit/945-telegram-integration.md) · 🇮🇹 [it](../../../it/_ideia/notfit/945-telegram-integration.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/945-telegram-integration.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/945-telegram-integration.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/945-telegram-integration.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/945-telegram-integration.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/945-telegram-integration.md) · 🇮🇳 [in](../../../in/_ideia/notfit/945-telegram-integration.md) · 🇹🇭 [th](../../../th/_ideia/notfit/945-telegram-integration.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/945-telegram-integration.md) · 🇮🇩 [id](../../../id/_ideia/notfit/945-telegram-integration.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/945-telegram-integration.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/945-telegram-integration.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/945-telegram-integration.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/945-telegram-integration.md) · 🇳🇴 [no](../../../no/_ideia/notfit/945-telegram-integration.md) · 🇩🇰 [da](../../../da/_ideia/notfit/945-telegram-integration.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/945-telegram-integration.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/945-telegram-integration.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/945-telegram-integration.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/945-telegram-integration.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/945-telegram-integration.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/945-telegram-integration.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/945-telegram-integration.md) · 🇮🇱 [he](../../../he/_ideia/notfit/945-telegram-integration.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/945-telegram-integration.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/945-telegram-integration.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/945-telegram-integration.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/945-telegram-integration.md) - ---- - -> GitHub Issue: #945 — opened by @inteligenciamilgrau on 2026-04-03 -> Status: 📋 Cataloged | Priority: Low - -## 📝 Original Request - -OpenClaw integrates with Telegram but only talks to OpenClaw. Request to add Telegram integration so users can chat with all CLIs (Claude Code, Codex, Gemini CLI) through Telegram. - -## 💬 Community Discussion - -### Participants - -- @inteligenciamilgrau — Original requester -- @oyi77 — Objected: "this shouldn't be in the router, imagine OpenRouter with Telegram integration — feels weird" -- @daniil-pogorelov — Suggested "just make a bot" - -### Key Points - -- Community split: some think it belongs in an orchestrator/agent layer, not a router -- Could be implemented as external bot using OmniRoute's API -- Scope creep concern for a routing proxy - -## 🎯 Refined Feature Description - -This is out of scope for OmniRoute's core mission as a proxy/router. Telegram integration belongs in an application/orchestrator layer that consumes OmniRoute's API, not inside OmniRoute itself. - -### What it solves - -- N/A — better served by external bot - -### Affected areas - -- N/A — recommend external implementation - -## 🔗 Related Ideas - -- None — this is a distinct concern from routing diff --git a/docs/i18n/zh-CN/_ideia/notfit/973-custom-provider-image-gen.md b/docs/i18n/zh-CN/_ideia/notfit/973-custom-provider-image-gen.md deleted file mode 100644 index 9c6d56a2cd..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/973-custom-provider-image-gen.md +++ /dev/null @@ -1,50 +0,0 @@ -# Feature: Image Generation for Custom OpenAI-Compatible Providers (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/973-custom-provider-image-gen.md) · 🇪🇸 [es](../../../es/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇪 [de](../../../de/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇹 [it](../../../it/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/973-custom-provider-image-gen.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/973-custom-provider-image-gen.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇳 [in](../../../in/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇭 [th](../../../th/_ideia/notfit/973-custom-provider-image-gen.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇩 [id](../../../id/_ideia/notfit/973-custom-provider-image-gen.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/973-custom-provider-image-gen.md) · 🇳🇴 [no](../../../no/_ideia/notfit/973-custom-provider-image-gen.md) · 🇩🇰 [da](../../../da/_ideia/notfit/973-custom-provider-image-gen.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/973-custom-provider-image-gen.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/973-custom-provider-image-gen.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/973-custom-provider-image-gen.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/973-custom-provider-image-gen.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/973-custom-provider-image-gen.md) · 🇮🇱 [he](../../../he/_ideia/notfit/973-custom-provider-image-gen.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/973-custom-provider-image-gen.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/973-custom-provider-image-gen.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/973-custom-provider-image-gen.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/973-custom-provider-image-gen.md) - ---- - -> GitHub Issue: #973 — opened by @hralamin6 on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium - -## 📝 Original Request - -Custom OpenAI-compatible providers support text completions but image generation doesn't work. Returns "Unknown embedding provider" errors. Requests full compatibility for image generation with custom providers. - -## 💬 Community Discussion - -### Participants - -- @hralamin6 — Original requester (followed up asking for update) - -### Key Points - -- Text completions work correctly with custom providers -- Image generation fails with unknown provider errors -- User expects `/v1/images/generations` to route through custom providers - -## 🎯 Refined Feature Description - -Extend the image generation handler to support routing requests to custom OpenAI-compatible providers, not just hardcoded providers. - -### What it solves - -- Custom providers with image generation capabilities can't be used for image tasks -- Users running local image generation servers (e.g., ComfyUI, SD WebUI) behind an OpenAI-compatible wrapper - -### How it should work - -1. When `/v1/images/generations` receives a request with a custom provider model -2. Look up the custom provider's base URL -3. Forward the request to `{baseUrl}/v1/images/generations` -4. Return the response unchanged - -### Affected areas - -- `open-sse/handlers/imageGeneration.ts` — add custom provider routing -- `open-sse/config/providerRegistry.ts` — image capability flag -- Custom provider node configuration — add image generation toggle - -## 🔗 Related Ideas - -- Related to [960-openrouter-embedding-image](./960-openrouter-embedding-image.md) — same pattern for embeddings diff --git a/docs/i18n/zh-CN/_ideia/notfit/982-codex-prompt-caching.md b/docs/i18n/zh-CN/_ideia/notfit/982-codex-prompt-caching.md deleted file mode 100644 index 6a67774848..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/982-codex-prompt-caching.md +++ /dev/null @@ -1,44 +0,0 @@ -# Feature: Prompt Caching support for Codex Models (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/982-codex-prompt-caching.md) · 🇪🇸 [es](../../../es/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇪 [de](../../../de/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇹 [it](../../../it/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/982-codex-prompt-caching.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/982-codex-prompt-caching.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇳 [in](../../../in/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇭 [th](../../../th/_ideia/notfit/982-codex-prompt-caching.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇩 [id](../../../id/_ideia/notfit/982-codex-prompt-caching.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/982-codex-prompt-caching.md) · 🇳🇴 [no](../../../no/_ideia/notfit/982-codex-prompt-caching.md) · 🇩🇰 [da](../../../da/_ideia/notfit/982-codex-prompt-caching.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/982-codex-prompt-caching.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/982-codex-prompt-caching.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/982-codex-prompt-caching.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/982-codex-prompt-caching.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/982-codex-prompt-caching.md) · 🇮🇱 [he](../../../he/_ideia/notfit/982-codex-prompt-caching.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/982-codex-prompt-caching.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/982-codex-prompt-caching.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/982-codex-prompt-caching.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/982-codex-prompt-caching.md) - ---- - -> GitHub Issue: #982 — opened by @diegosouzapw on 2026-04-04 -> Status: 📋 Cataloged | Priority: Medium -> Source: Discussion 584 by @alfonsofeliz - -## 📝 Original Request - -Add native prompt caching passthrough for Codex models via standard upstream cache-control headers. Update the translator layer to transparently pass those along. - -## 💬 Community Discussion - -### Participants - -- @diegosouzapw — Issue creator -- @alfonsofeliz — Original discussion author - -### Key Points - -- Codex (OpenAI) supports prompt caching but OmniRoute may strip the relevant headers -- Need to ensure cache-control headers flow through the translation layer - -## 🎯 Refined Feature Description - -Ensure the Codex executor and translator preserve upstream prompt caching headers and parameters. The OpenAI API supports `cached_tokens` in usage responses — ensure these are not stripped during translation. - -### What it solves - -- Codex users losing prompt cache benefits when routing through OmniRoute -- Reduced API costs through proper cache utilization - -### Affected areas - -- `open-sse/executors/codex.ts` — header passthrough -- `open-sse/translator/` — cache header preservation -- Token accounting — recognize cached tokens in usage stats - -## 🔗 Related Ideas - -- Partially addressed already in v3.5.4 (Anthropic cache token accounting) diff --git a/docs/i18n/zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md b/docs/i18n/zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md deleted file mode 100644 index b56ca93285..0000000000 --- a/docs/i18n/zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md +++ /dev/null @@ -1,143 +0,0 @@ -# 1. Título da Feature (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇪🇸 [es](../../../es/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇷 [fr](../../../fr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇪 [de](../../../de/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇹 [it](../../../it/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇺 [ru](../../../ru/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇯🇵 [ja](../../../ja/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇰🇷 [ko](../../../ko/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇦 [ar](../../../ar/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [hi](../../../hi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇳 [in](../../../in/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇭 [th](../../../th/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇻🇳 [vi](../../../vi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇩 [id](../../../id/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇲🇾 [ms](../../../ms/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇱 [nl](../../../nl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇱 [pl](../../../pl/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇪 [sv](../../../sv/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇳🇴 [no](../../../no/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇩🇰 [da](../../../da/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇫🇮 [fi](../../../fi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇹 [pt](../../../pt/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇷🇴 [ro](../../../ro/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇭🇺 [hu](../../../hu/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇬 [bg](../../../bg/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇸🇰 [sk](../../../sk/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇮🇱 [he](../../../he/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇵🇭 [phi](../../../phi/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇨🇿 [cs](../../../cs/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) · 🇹🇷 [tr](../../../tr/_ideia/notfit/feature-43-governanca-de-ownership-por-credencial.md) - ---- - -Feature 19 — Governança de Ownership por Credencial - -## 2. Objetivo - -Introduzir modelo opcional de ownership por credencial (API key/OAuth account) para separar visibilidade e ação por usuário em ambientes compartilhados. - -## 3. Motivação - -Quando múltiplas pessoas usam a mesma instância, falta granularidade de ownership para limitar exposição de credenciais e dados de uso. - -## 4. Problema Atual (Antes) - -- Modelo atual é centrado em autenticação simples. -- Não há vínculo forte entre usuário e credenciais gerenciadas. -- Dados podem ser vistos/alterados além do necessário em ambiente compartilhado. - -### Antes vs Depois - -| Dimensão | Antes | Depois | -| --------------------------------- | ------------ | ------------------------- | -| Controle de acesso por credencial | Não granular | Ownership explícito | -| Privacidade de chaves/contas | Limitada | Mascaramento por não-dono | -| Auditoria por ator | Parcial | Mais precisa | - -## 5. Estado Futuro (Depois) - -Camada de ownership com regras de leitura/escrita por usuário e visão administrativa consolidada. - -## 6. O que Ganhamos - -- Segurança operacional em times. -- Menos risco de alteração acidental de credenciais de terceiros. -- Base para RBAC progressivo. - -## 7. Escopo - -- Modelo de ownership em storage. -- Regras de autorização por rota de provider/keys/oauth. -- Mascaramento de campos sensíveis para não-donos. - -## 8. Fora de Escopo - -- IAM corporativo completo. -- SSO empresarial nesta fase. - -## 9. Arquitetura Proposta - -```mermaid -flowchart TD - A[request autenticada] --> B[resolve user] - B --> C[check ownership/resource] - C -->|allow| D[action] - C -->|deny| E[403] - D --> F[audit event] -``` - -## 10. Mudanças Técnicas Detalhadas - -Arquivos de referência: - -- `src/lib/db/providers.js` -- `src/app/api/providers/*` -- `src/app/api/keys/*` -- `src/app/api/oauth/*` - -Direção técnica: - -1. Adicionar tabela/namespace de ownership por recurso. -2. Enriquecer middleware de autorização para rotas de gestão. -3. Em listagens, mascarar dados sensíveis para não-donos. - -## 11. Impacto em APIs Públicas / Interfaces / Tipos - -- APIs novas: possivelmente endpoints admin de ownership. -- APIs alteradas: filtros adicionais em rotas de gestão. -- Compatibilidade: **potencialmente breaking em comportamento**, não em schema. -- Recomendação: introduzir por feature flag. - -## 12. Passo a Passo de Implementação Futura - -1. Definir modelo de ownership no storage. -2. Migrar fluxo de criação de credencial para gravar owner. -3. Aplicar filtros em GET/PUT/DELETE sensíveis. -4. Implementar mascaramento e trilha de auditoria. -5. Cobrir testes de autorização. - -## 13. Plano de Testes - -Cenários positivos: - -1. Usuário dono lê e altera sua credencial. -2. Admin enxerga e gerencia tudo. - -Cenários de erro: - -3. Usuário não-dono recebe 403 em alteração. - -Regressão: - -4. Single-user continua funcional sem overhead excessivo. - -Compatibilidade retroativa: - -5. Credenciais antigas sem owner recebem owner default/migração controlada. - -## 14. Critérios de Aceite - -- [ ] Given credencial com owner, When não-dono tenta alterar, Then recebe 403. -- [ ] Given admin, When consulta credenciais, Then visibilidade total é preservada. -- [ ] Given usuário comum, When lista recursos, Then dados sensíveis de terceiros são mascarados. - -## 15. Riscos e Mitigações - -- Risco: complexidade de autorização crescer rápido. -- Mitigação: política simples inicial (owner/admin), sem hierarquia complexa. - -## 16. Plano de Rollout - -1. Ativar em ambientes multiusuário primeiro. -2. Medir impacto de autorização. -3. Expandir para todas as rotas de gestão. - -## 17. Métricas de Sucesso - -- Redução de operações indevidas em credenciais de terceiros. -- Aumento de rastreabilidade por usuário. - -## 18. Dependências entre Features - -- Reforça `feature-observabilidade-de-auditoria-e-acoes-administrativas-21.md`. - -## 19. Checklist Final da Feature - -- [ ] Modelo de ownership definido. -- [ ] Autorização aplicada em rotas críticas. -- [ ] Mascaramento implementável. -- [ ] Testes de permissão cobrindo owner/admin. diff --git a/docs/i18n/zh-CN/_ideia/viable/1350-persist-api-key-docker.md b/docs/i18n/zh-CN/_ideia/viable/1350-persist-api-key-docker.md deleted file mode 100644 index 9b56e4744b..0000000000 --- a/docs/i18n/zh-CN/_ideia/viable/1350-persist-api-key-docker.md +++ /dev/null @@ -1,79 +0,0 @@ -# Feature: Persist API-Key via Docker Volume to Avoid Regeneration (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1350-persist-api-key-docker.md) · 🇪🇸 [es](../../../es/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇪 [de](../../../de/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇹 [it](../../../it/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1350-persist-api-key-docker.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1350-persist-api-key-docker.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇳 [in](../../../in/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇭 [th](../../../th/_ideia/viable/1350-persist-api-key-docker.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇩 [id](../../../id/_ideia/viable/1350-persist-api-key-docker.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1350-persist-api-key-docker.md) · 🇳🇴 [no](../../../no/_ideia/viable/1350-persist-api-key-docker.md) · 🇩🇰 [da](../../../da/_ideia/viable/1350-persist-api-key-docker.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1350-persist-api-key-docker.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1350-persist-api-key-docker.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1350-persist-api-key-docker.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1350-persist-api-key-docker.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1350-persist-api-key-docker.md) · 🇮🇱 [he](../../../he/_ideia/viable/1350-persist-api-key-docker.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1350-persist-api-key-docker.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1350-persist-api-key-docker.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1350-persist-api-key-docker.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1350-persist-api-key-docker.md) - ---- - -> GitHub Issue: #1350 — opened by @raphaelnugas on 2026-04-16 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -Every time OmniRoute is updated via Docker and a backup is restored, the API key is changed, forcing all integrated systems to regenerate and reconfigure. This causes service disruption in production environments where multiple systems depend on the key. - -**Steps to reproduce (from author):** - -1. Install/update OmniRoute via Docker -2. Restore the backup -3. Previous API key is no longer valid -4. Need to generate a new API key and distribute to all clients - -**Proposed solutions (from author):** - -1. Store API key in a file within the persisted Docker volume (`DATA_DIR/api_key`) so it survives container recreation -2. Support setting the API key via an environment variable (`OMNI_API_KEY`) that can be mounted as a Docker secret - -**Acceptance Criteria (from author):** - -- API key stored in Docker volume file (`DATA_DIR`) -- After container restart/update, same API key is used -- After backup restore, original API key remains valid -- If no API key file exists (first install), a new key is generated automatically - -## 💬 Community Discussion - -### Participants - -- @raphaelnugas — Original requester, production user with multi-system integrations - -### Key Points - -- Critical for production Docker deployments where multiple downstream services rely on the API key -- Current behavior regenerates keys on container recreation, breaking all integrations -- Two complementary approaches proposed: file-based persistence and env var override -- No objections or alternative proposals - -## 🎯 Refined Feature Description - -Make OmniRoute's internal API key persistent across Docker container recreations by storing it in the Docker volume (`DATA_DIR`) and optionally allowing it to be set via an environment variable. - -### What it solves - -- API key changes after Docker container recreation, breaking all downstream integrations -- Service disruption requiring manual key regeneration and distribution after every update -- Lack of declarative key management support for infrastructure-as-code Docker deployments - -### How it should work (high level) - -1. On startup, check for `OMNI_API_KEY` environment variable — if set, use it as the API key (highest priority) -2. If no env var, check for `DATA_DIR/api_key` file — if exists, read key from file -3. If neither exists (first-time install), generate a new key and persist it to `DATA_DIR/api_key` -4. After any key generation or change via the dashboard, update the `DATA_DIR/api_key` file -5. On backup restore, if the backup contains a different key, prefer the file-based key (or prompt user) -6. Document the `OMNI_API_KEY` env var in the Docker Compose example and README - -### Affected areas - -- `src/lib/db/apiKeys.ts` — modify key generation/loading to check file + env var -- `src/lib/db/core.ts` — startup key initialization sequence -- Docker configuration — update `docker-compose.yml` example with `OMNI_API_KEY` support -- Documentation — update Docker deployment docs with key persistence guidance -- `src/app/api/settings/` — key change should persist to file - -## 📎 Attachments & References - -- No external references - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/zh-CN/_ideia/viable/1367-limit-db-backup-count.md b/docs/i18n/zh-CN/_ideia/viable/1367-limit-db-backup-count.md deleted file mode 100644 index c16f8bc0d0..0000000000 --- a/docs/i18n/zh-CN/_ideia/viable/1367-limit-db-backup-count.md +++ /dev/null @@ -1,67 +0,0 @@ -# Feature: Limit Database Backup Count (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1367-limit-db-backup-count.md) · 🇪🇸 [es](../../../es/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇪 [de](../../../de/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇹 [it](../../../it/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1367-limit-db-backup-count.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1367-limit-db-backup-count.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇳 [in](../../../in/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇭 [th](../../../th/_ideia/viable/1367-limit-db-backup-count.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇩 [id](../../../id/_ideia/viable/1367-limit-db-backup-count.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1367-limit-db-backup-count.md) · 🇳🇴 [no](../../../no/_ideia/viable/1367-limit-db-backup-count.md) · 🇩🇰 [da](../../../da/_ideia/viable/1367-limit-db-backup-count.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1367-limit-db-backup-count.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1367-limit-db-backup-count.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1367-limit-db-backup-count.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1367-limit-db-backup-count.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1367-limit-db-backup-count.md) · 🇮🇱 [he](../../../he/_ideia/viable/1367-limit-db-backup-count.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1367-limit-db-backup-count.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1367-limit-db-backup-count.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1367-limit-db-backup-count.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1367-limit-db-backup-count.md) - ---- - -> GitHub Issue: #1367 — opened by @gmonchain on 2026-04-17 -> Status: ✅ VIABLE | Priority: MEDIUM - -## 📝 Original Request - -The application currently generates too many database backup files without an option to limit the number of backups stored. This leads to unnecessary storage usage and complicates backup management. The user requests a feature that allows setting a maximum number of backups retained, with automatic deletion of older backups when the limit is reached. - -**Acceptance Criteria (from author):** - -- Users can set a maximum backup count in the settings -- When the backup count exceeds the limit, the system automatically deletes older backups -- The user interface notifies users when a backup has been deleted -- No errors occur during the backup storage and deletion process - -## 💬 Community Discussion - -### Participants - -- @gmonchain — Original requester, provided screenshot of excessive backups and clear acceptance criteria - -### Key Points - -- User showed a screenshot with many accumulated backup files -- The request is straightforward: add a configurable cap and auto-prune -- No objections or alternative proposals -- User also suggested a notification when pruning occurs - -## 🎯 Refined Feature Description - -Add a configurable maximum backup count setting to the OmniRoute dashboard. When the number of stored backups exceeds this limit, the system should automatically delete the oldest backups to free storage space. - -### What it solves - -- Unbounded growth of backup files consuming disk space -- Manual cleanup burden on users running OmniRoute for extended periods -- Storage issues on Docker deployments with limited volume sizes - -### How it should work (high level) - -1. Add a `maxBackupCount` setting to the `key_value` table (namespace: `settings`, key: `maxBackupCount`) -2. Provide a UI control in Dashboard → Settings → Backup section for configuring the limit (default: unlimited / 0) -3. After every successful backup creation, count existing backups -4. If count exceeds `maxBackupCount`, delete the oldest backups until the count is within the limit -5. Log a message when backups are pruned (visible in the console and optionally in the dashboard notification area) -6. Expose the setting via the MCP server and API for programmatic access - -### Affected areas - -- `src/lib/db/backup.ts` — add pruning logic after backup creation -- `src/lib/db/settings.ts` — add `maxBackupCount` setting with default -- `src/app/api/settings/` — expose new setting via API -- `src/app/(dashboard)/dashboard/settings/` — add UI control for backup limit -- i18n — new translation keys for backup limit UI labels - -## 📎 Attachments & References - -- Screenshot showing excessive backup files: https://github.com/user-attachments/assets/a0529f40-37d9-45db-a925-a5491f98671a - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md b/docs/i18n/zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md deleted file mode 100644 index c95b61c90b..0000000000 --- a/docs/i18n/zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md +++ /dev/null @@ -1,75 +0,0 @@ -# Feature: Reduce GPU Usage of the UI (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇪🇸 [es](../../../es/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇷 [fr](../../../fr/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇪 [de](../../../de/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇹 [it](../../../it/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇺 [ru](../../../ru/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇳 [zh-CN](../../../zh-CN/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇯🇵 [ja](../../../ja/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇰🇷 [ko](../../../ko/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇦 [ar](../../../ar/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [hi](../../../hi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇳 [in](../../../in/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇭 [th](../../../th/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇻🇳 [vi](../../../vi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇩 [id](../../../id/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇲🇾 [ms](../../../ms/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇱 [nl](../../../nl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇱 [pl](../../../pl/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇪 [sv](../../../sv/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇳🇴 [no](../../../no/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇩🇰 [da](../../../da/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇫🇮 [fi](../../../fi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇹 [pt](../../../pt/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇷🇴 [ro](../../../ro/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇭🇺 [hu](../../../hu/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇬 [bg](../../../bg/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇸🇰 [sk](../../../sk/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇺🇦 [uk-UA](../../../uk-UA/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇮🇱 [he](../../../he/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇵🇭 [phi](../../../phi/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇧🇷 [pt-BR](../../../pt-BR/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇨🇿 [cs](../../../cs/_ideia/viable/1369-reduce-gpu-usage-ui.md) · 🇹🇷 [tr](../../../tr/_ideia/viable/1369-reduce-gpu-usage-ui.md) - ---- - -> GitHub Issue: #1369 — opened by @sergedc on 2026-04-17 -> Status: ✅ VIABLE | Priority: HIGH - -## 📝 Original Request - -When on `/dashboard/limits` or `/dashboard/logs`, the GPU usage (Nvidia RTX 3060 mobile) spikes to 30% in Windows 11 Task Manager. This only happens when the tab is active — switching to another tab drops GPU to 0%. Returning to those pages brings it back to 30%. - -The root cause is the browser being forced to re-composite expensive `backdrop-filter: blur()` layers every time re-renders happen following the frequent API calls to update logs and limits data. - -**Reproduction**: Requires a 4K screen with high DPI to observe the spike. - -### Proposed Solutions (from author) - -**A. Replace blurs with solid colors** (biggest impact): - -- `Sidebar.tsx`: Remove `bg-vibrancy backdrop-blur-xl`, use opaque `bg-sidebar` -- `Header.tsx`: Remove `bg-bg/80 backdrop-blur-xl`, use opaque `bg-bg` - -**B. Memoize data** to skip identical re-renders: - -- In `RequestLoggerV2.tsx` and `ProxyLogger.tsx`, only call `setLogs` if data actually changed (JSON comparison) - -**C. Add `content-visibility: auto`** to table rows to skip painting off-screen rows, limiting repaint blast radius. - -## 💬 Community Discussion - -### Participants - -- @sergedc — Original requester, provided root cause analysis and 3 concrete solutions - -### Key Points - -- Issue is specific to pages with frequent data refresh cycles (logs, limits) -- GPU spike is caused by CSS `backdrop-filter: blur()` compositing on every React re-render -- All 3 proposed solutions are complementary and low-risk -- No other comments or objections - -## 🎯 Refined Feature Description - -Reduce unnecessary GPU utilization on dashboard pages that perform frequent data polling by eliminating expensive CSS compositing effects and preventing unnecessary React re-renders. - -### What it solves - -- 30% GPU spike on dashboard pages with frequent data refreshes (logs, limits) -- Browser forced to re-composite expensive backdrop-filter blur layers every re-render cycle -- Particularly impactful on high-DPI 4K displays where compositing cost is multiplied - -### How it should work (high level) - -1. Replace `backdrop-blur-xl` with opaque solid backgrounds in `Sidebar.tsx` and `Header.tsx` -2. Add data memoization in `RequestLoggerV2.tsx` and `ProxyLogger.tsx` — compare incoming data with previous state before triggering a re-render -3. Add `content-visibility: auto` CSS to log/limit table rows to skip painting off-screen content -4. Verify visual appearance is maintained (opaque backgrounds should still look good in both light/dark themes) - -### Affected areas - -- `src/shared/components/Sidebar.tsx` — replace blur with opaque background -- `src/shared/components/Header.tsx` — replace blur with opaque background -- `src/app/(dashboard)/dashboard/logs/` — memoize log data fetches -- `src/app/(dashboard)/dashboard/limits/` — memoize limit data fetches -- Global CSS / Tailwind — `content-visibility: auto` utility - -## 📎 Attachments & References - -- No external references; author provided inline analysis - -## 🔗 Related Ideas - -- No directly related ideas in the backlog diff --git a/docs/i18n/zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md b/docs/i18n/zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md deleted file mode 100644 index 9c86c16f43..0000000000 --- a/docs/i18n/zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md +++ /dev/null @@ -1,81 +0,0 @@ -# Feature: Add Meta Muse Spark (meta.ai) Web Subscription Provider (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇪🇸 [es](../../../../es/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇷 [fr](../../../../fr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇪 [de](../../../../de/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇹 [it](../../../../it/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇺 [ru](../../../../ru/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇳 [zh-CN](../../../../zh-CN/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇯🇵 [ja](../../../../ja/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇰🇷 [ko](../../../../ko/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇦 [ar](../../../../ar/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [hi](../../../../hi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇳 [in](../../../../in/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇭 [th](../../../../th/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇻🇳 [vi](../../../../vi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇩 [id](../../../../id/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇲🇾 [ms](../../../../ms/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇱 [nl](../../../../nl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇱 [pl](../../../../pl/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇪 [sv](../../../../sv/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇳🇴 [no](../../../../no/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇩🇰 [da](../../../../da/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇫🇮 [fi](../../../../fi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇹 [pt](../../../../pt/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇷🇴 [ro](../../../../ro/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇭🇺 [hu](../../../../hu/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇬 [bg](../../../../bg/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇸🇰 [sk](../../../../sk/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇺🇦 [uk-UA](../../../../uk-UA/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇮🇱 [he](../../../../he/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇵🇭 [phi](../../../../phi/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇧🇷 [pt-BR](../../../../pt-BR/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇨🇿 [cs](../../../../cs/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) · 🇹🇷 [tr](../../../../tr/_ideia/viable/need_details/1308-meta-muse-spark-provider.md) - ---- - -> GitHub Issue: #1308 — opened by @dhaern on 2026-04-16 -> Status: ❓ NEEDS DETAIL | Priority: Medium - -## 📝 Original Request - -Add Meta Muse Spark (meta.ai) as a web subscription provider, supporting cookie-based access to the chat interface for text generation. The proposal covers three model variants: - -- `muse-spark` — instant mode -- `muse-spark-thinking` — thinking mode -- `muse-spark-contemplating` — deep reasoning mode - -The proposed auth flow involves a 3-step cookie acquisition process: - -1. GET meta.ai → extract `lsd` + `dtsg` tokens from HTML -2. POST `useAbraAcceptTOSForTempUserMutation` → get access token -3. POST `graph.meta.ai/graphql` with `abra_sess` cookie - -## 💬 Community Discussion - -### Participants - -- @dhaern — Original requester, detailed proposal with auth flow, model variants, and file structure -- @RaviTharuma — Contributor (built Grok Web + Perplexity Web executors), provided feasibility analysis - -### Key Points - -- **@RaviTharuma's analysis is critical:** - - Auth pattern similar to Grok/Perplexity Web executors — feasible - - Primary reference `Strvm/meta-ai-api` (398 stars) is 2 years stale (Llama 3 era) - - Meta's multi-step auth is harder than Grok/Perplexity (3 steps vs 1 cookie) - - Facebook's anti-bot infrastructure is more aggressive (DTSG tokens, Captcha challenges) - - Found `dyagz/LLM-Proxy-API` (Apr 2026) — uses Playwright browser automation, suggesting API may be locked down -- **Two possible approaches:** - 1. **Cookie + GraphQL** (preferred) — stateless, clean, follows existing executor pattern - 2. **Playwright browser automation** — works but heavy, single-session, requires browser process -- **Blocker:** Needs fresh API traffic capture from meta.ai to verify current GraphQL mutations - -## 🎯 Refined Feature Description - -Add a cookie-based executor for Meta Muse Spark following the same pattern as Grok Web and Perplexity Web executors, supporting text generation through meta.ai's GraphQL API. - -### What it solves - -- Enables Meta AI subscribers to route requests through OmniRoute -- Adds a major free-tier AI model provider to the catalog -- Extends web-subscription provider coverage - -### How it should work (high level) - -1. User provides their `abra_sess` cookie from meta.ai in the dashboard -2. OmniRoute sends GraphQL mutations to `graph.meta.ai/graphql` -3. Supports streaming responses via NDJSON or SSE (to be confirmed from traffic capture) -4. Maps to three model variants: instant, thinking, contemplating - -### Affected areas - -- `open-sse/executors/` — new `meta-ai.ts` executor -- `src/shared/constants/providers.ts` — register in `WEB_COOKIE_PROVIDERS` -- `open-sse/config/providerRegistry.ts` — model registration (3 variants) -- Dashboard provider UI — new provider card with cookie auth - -### What is needed to proceed - -1. Fresh network traffic capture from meta.ai (HAR export or request/response bodies) -2. Confirmation of current GraphQL mutation names for Muse Spark -3. Verification of whether pure HTTP/GraphQL approach is still viable (vs. Playwright-only) - -## 📎 Attachments & References - -- `Strvm/meta-ai-api` (398 stars): https://github.com/Strvm/meta-ai-api — primary reference (stale) -- `dyagz/LLM-Proxy-API` (Apr 2026): browser-backed proxy for meta.ai — alternative approach - -## 🔗 Related Ideas - -- Same pattern as Grok Web (`open-sse/executors/grok-web.ts`) and Perplexity Web executors diff --git a/docs/i18n/zh-CN/src/lib/a2a/README.md b/docs/i18n/zh-CN/src/lib/a2a/README.md deleted file mode 100644 index 6057ca3a05..0000000000 --- a/docs/i18n/zh-CN/src/lib/a2a/README.md +++ /dev/null @@ -1,752 +0,0 @@ -# OmniRoute A2A Server (中文(简体)) - -🌐 **Languages:** 🇺🇸 [English](../../../../../../src/lib/a2a/README.md) · 🇪🇸 [es](../../../../es/src/lib/a2a/README.md) · 🇫🇷 [fr](../../../../fr/src/lib/a2a/README.md) · 🇩🇪 [de](../../../../de/src/lib/a2a/README.md) · 🇮🇹 [it](../../../../it/src/lib/a2a/README.md) · 🇷🇺 [ru](../../../../ru/src/lib/a2a/README.md) · 🇨🇳 [zh-CN](../../../../zh-CN/src/lib/a2a/README.md) · 🇯🇵 [ja](../../../../ja/src/lib/a2a/README.md) · 🇰🇷 [ko](../../../../ko/src/lib/a2a/README.md) · 🇸🇦 [ar](../../../../ar/src/lib/a2a/README.md) · 🇮🇳 [hi](../../../../hi/src/lib/a2a/README.md) · 🇮🇳 [in](../../../../in/src/lib/a2a/README.md) · 🇹🇭 [th](../../../../th/src/lib/a2a/README.md) · 🇻🇳 [vi](../../../../vi/src/lib/a2a/README.md) · 🇮🇩 [id](../../../../id/src/lib/a2a/README.md) · 🇲🇾 [ms](../../../../ms/src/lib/a2a/README.md) · 🇳🇱 [nl](../../../../nl/src/lib/a2a/README.md) · 🇵🇱 [pl](../../../../pl/src/lib/a2a/README.md) · 🇸🇪 [sv](../../../../sv/src/lib/a2a/README.md) · 🇳🇴 [no](../../../../no/src/lib/a2a/README.md) · 🇩🇰 [da](../../../../da/src/lib/a2a/README.md) · 🇫🇮 [fi](../../../../fi/src/lib/a2a/README.md) · 🇵🇹 [pt](../../../../pt/src/lib/a2a/README.md) · 🇷🇴 [ro](../../../../ro/src/lib/a2a/README.md) · 🇭🇺 [hu](../../../../hu/src/lib/a2a/README.md) · 🇧🇬 [bg](../../../../bg/src/lib/a2a/README.md) · 🇸🇰 [sk](../../../../sk/src/lib/a2a/README.md) · 🇺🇦 [uk-UA](../../../../uk-UA/src/lib/a2a/README.md) · 🇮🇱 [he](../../../../he/src/lib/a2a/README.md) · 🇵🇭 [phi](../../../../phi/src/lib/a2a/README.md) · 🇧🇷 [pt-BR](../../../../pt-BR/src/lib/a2a/README.md) · 🇨🇿 [cs](../../../../cs/src/lib/a2a/README.md) · 🇹🇷 [tr](../../../../tr/src/lib/a2a/README.md) - ---- - -> **Agent-to-Agent Protocol v0.3** — Enables any AI agent to use OmniRoute as an intelligent routing agent via JSON-RPC 2.0. - -The A2A Server exposes OmniRoute as a **first-class agent** that other agents can discover, delegate tasks to, and collaborate with using the [A2A Protocol](https://google.github.io/A2A/). - ---- - -## 架构 - -``` -┌──────────────────────────────────────────────────────────────────┐ -│ Orchestrator Agent │ -│ (LangChain, CrewAI, AutoGen, Custom Agent) │ -└──────────────────────┬───────────────────────────────────────────┘ - │ 1. GET /.well-known/agent.json (discover) - │ 2. POST /a2a (JSON-RPC 2.0) - ▼ -┌──────────────────────────────────────────────────────────────────┐ -│ OmniRoute A2A Server │ -│ ┌────────────────┐ ┌────────────────┐ ┌───────────────────┐ │ -│ │ Task Manager │ │ Skill Engine │ │ SSE Streaming │ │ -│ │ (lifecycle) │──│ (registry) │──│ (real-time) │ │ -│ └────────────────┘ └────────┬───────┘ └───────────────────┘ │ -│ │ │ -│ Skills: │ │ -│ ├─ smart-routing ──────────┤ ┌────────────────────────────┐ │ -│ └─ quota-management ───────┘ │ Routing Decision Logger │ │ -│ └────────────────────────────┘ │ -└──────────────────────────────────────────────────────────────────┘ - │ - ▼ OmniRoute Gateway (internal) - /v1/chat/completions, /api/combos, /api/usage/quota -``` - ---- - -## 快速开始 - -### Agent Discovery - -Every A2A-compatible agent exposes an **Agent Card** at `/.well-known/agent.json`: - -```bash -curl http://localhost:20128/.well-known/agent.json -``` - -**Response:** - -```json -{ - "name": "OmniRoute", - "description": "Intelligent AI gateway with auto-routing across 50+ providers", - "url": "http://localhost:20128/a2a", - "version": "1.8.1", - "capabilities": { - "streaming": true, - "pushNotifications": false - }, - "skills": [ - { - "id": "smart-routing", - "name": "Smart Routing", - "description": "Routes prompts through OmniRoute intelligent pipeline", - "tags": ["routing", "llm", "multi-provider", "cost-optimization"], - "examples": [ - "Write a hello world in Python", - "Explain quantum computing using the cheapest provider" - ] - }, - { - "id": "quota-management", - "name": "Quota Management", - "description": "Natural-language queries about provider quotas", - "tags": ["quota", "analytics", "cost"], - "examples": [ - "Which provider has the most quota remaining?", - "Suggest a free combo for coding" - ] - } - ], - "authentication": { - "schemes": ["bearer"], - "apiKeyHeader": "Authorization" - } -} -``` - ---- - -## JSON-RPC 2.0 Methods - -### `message/send` — Synchronous Execution - -Send a message to a skill and receive the complete response. - -```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 Python hello world"}], - "metadata": {"model": "auto", "combo": "fast-coding"} - } - }' -``` - -**Response:** - -```json -{ - "jsonrpc": "2.0", - "id": "1", - "result": { - "task": { "id": "a1b2c3d4-...", "state": "completed" }, - "artifacts": [{ "type": "text", "content": "print('Hello, World!')" }], - "metadata": { - "routing_explanation": "Selected claude-sonnet via provider \"anthropic\" (latency: 1200ms, cost: $0.0030)", - "cost_envelope": { "estimated": 0.005, "actual": 0.003, "currency": "USD" }, - "resilience_trace": [ - { "event": "primary_selected", "provider": "anthropic", "timestamp": "2026-03-04T..." } - ], - "policy_verdict": { "allowed": true, "reason": "within budget and quota limits" } - } - } -} -``` - -### `message/stream` — SSE Streaming - -Same as `message/send` but returns Server-Sent Events for real-time streaming. - -```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"}] - } - }' -``` - -**SSE Events:** - -``` -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"working"},"chunk":{"type":"text","content":"Quantum computing..."}}} - -: heartbeat 2026-03-04T21:00:00Z - -data: {"jsonrpc":"2.0","method":"message/stream","params":{"task":{"id":"...","state":"completed"},"metadata":{...}}} -``` - -### `tasks/get` — Query Task Status - -```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` — Cancel a Running Task - -```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"}}' -``` - ---- - -## Skills Reference - -### `smart-routing` - -Routes prompts through OmniRoute's intelligent pipeline with full observability. - -**Parameters (in `metadata`):** - -| Parameter | Type | Default | Description | -| --------- | -------- | ------------ | ---------------------------------------------------------------------------------------- | -| `model` | `string` | `"auto"` | Target model (e.g., `claude-sonnet-4`, `gpt-4o`, `auto`) | -| `combo` | `string` | active combo | Specific combo to route through | -| `budget` | `number` | none | Maximum cost in USD for this request | -| `role` | `string` | none | Task role hint: `coding`, `review`, `planning`, `analysis`, `debugging`, `documentation` | - -**Returns:** - -| Field | Description | -| ------------------------------ | --------------------------------------------------------- | -| `artifacts[].content` | The LLM response text | -| `metadata.routing_explanation` | Human-readable explanation of routing decision | -| `metadata.cost_envelope` | Estimated vs actual cost with currency | -| `metadata.resilience_trace` | Array of events (primary_selected, fallback_needed, etc.) | -| `metadata.policy_verdict` | Whether the request was allowed and why | - -### `quota-management` - -Answers natural-language queries about provider quotas. - -**Query types (inferred from message content):** - -| Query Pattern | Response Type | -| ---------------------------------------------- | -------------------------------------------------------- | -| Contains `"ranking"`, `"most quota"`, `"best"` | Providers ranked by remaining quota | -| Contains `"free"`, `"suggest"` | Lists free combos or suggests free-tier providers | -| Default | Full quota summary with warnings for low-quota providers | - ---- - -## Task Lifecycle - -``` -submitted ──→ working ──→ completed - ──→ failed - ──────────→ cancelled -``` - -| State | Description | -| ----------- | ----------------------------------------------------- | -| `submitted` | Task created, queued for execution | -| `working` | Skill handler is executing | -| `completed` | Execution succeeded, artifacts available | -| `failed` | Execution failed or task expired (TTL: 5 min default) | -| `cancelled` | Cancelled by client via `tasks/cancel` | - -- Terminal states: `completed`, `failed`, `cancelled` (no further transitions) -- Expired tasks in `submitted` or `working` are auto-marked as `failed` -- Tasks are garbage-collected after 2× TTL - ---- - -## Client Examples - -### Python — Orchestrator Agent - -```python -""" -A2A Client — Python example. -Discovers OmniRoute agent, sends a task, and processes the result. -""" -import requests -import json - -BASE_URL = "http://localhost:20128" -API_KEY = "your-api-key" -HEADERS = { - "Content-Type": "application/json", - "Authorization": f"Bearer {API_KEY}", -} - -# 1. Discover agent capabilities -agent_card = requests.get(f"{BASE_URL}/.well-known/agent.json").json() -print(f"Agent: {agent_card['name']} v{agent_card['version']}") -print(f"Skills: {[s['id'] for s in agent_card['skills']]}") - -# 2. Send a smart-routing task -response = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": "Write a Python quicksort implementation"}], - "metadata": { - "model": "auto", - "combo": "fast-coding", - "budget": 0.10, - } - } -}) -result = response.json()["result"] -print(f"\n📝 Response: {result['artifacts'][0]['content'][:200]}...") -print(f"🔀 Routing: {result['metadata']['routing_explanation']}") -print(f"💰 Cost: ${result['metadata']['cost_envelope']['actual']}") -print(f"🛡️ Policy: {result['metadata']['policy_verdict']['reason']}") - -# 3. Query quota status -quota_resp = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "task-2", - "method": "message/send", - "params": { - "skill": "quota-management", - "messages": [{"role": "user", "content": "Which provider has the most quota remaining?"}], - } -}) -quota_result = quota_resp.json()["result"] -print(f"\n📊 Quota: {quota_result['artifacts'][0]['content']}") -``` - -### TypeScript — Multi-Agent Orchestrator - -```typescript -/** - * A2A Client — TypeScript example. - * Shows agent discovery, task delegation, and streaming. - */ - -const BASE_URL = "http://localhost:20128"; -const API_KEY = "your-api-key"; - -interface JsonRpcResponse { - jsonrpc: "2.0"; - id: string | number; - result?: T; - error?: { code: number; message: string }; -} - -async function a2aCall(method: string, params: Record): Promise { - const resp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: `${method}-${Date.now()}`, - method, - params, - }), - }); - const json: JsonRpcResponse = await resp.json(); - if (json.error) throw new Error(`[${json.error.code}] ${json.error.message}`); - return json.result!; -} - -// ── Agent Discovery ── -const agentCard = await fetch(`${BASE_URL}/.well-known/agent.json`).then((r) => r.json()); -console.log(`Connected to: ${agentCard.name} (${agentCard.skills.length} skills)`); - -// ── Smart Routing: Send a coding task ── -const routingResult = await a2aCall("message/send", { - skill: "smart-routing", - messages: [{ role: "user", content: "Implement a Redis cache wrapper in TypeScript" }], - metadata: { model: "claude-sonnet-4", role: "coding" }, -}); -console.log("Response:", routingResult.artifacts[0].content); -console.log("Provider:", routingResult.metadata.routing_explanation); - -// ── Quota Management: Find free alternatives ── -const quotaResult = await a2aCall("message/send", { - skill: "quota-management", - messages: [{ role: "user", content: "Suggest free combos for documentation" }], -}); -console.log("Free combos:", quotaResult.artifacts[0].content); - -// ── Streaming: Real-time response ── -const streamResp = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { - "Content-Type": "application/json", - Authorization: `Bearer ${API_KEY}`, - }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "stream-1", - method: "message/stream", - params: { - skill: "smart-routing", - messages: [{ role: "user", content: "Explain microservices architecture" }], - }, - }), -}); - -const reader = streamResp.body!.getReader(); -const decoder = new TextDecoder(); -while (true) { - const { done, value } = await reader.read(); - if (done) break; - const chunk = decoder.decode(value); - for (const line of chunk.split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - if (event.params.chunk) { - process.stdout.write(event.params.chunk.content); - } - if (event.params.task.state === "completed") { - console.log("\n✅ Stream completed"); - } - } - } -} -``` - -### Python — LangChain A2A Integration - -```python -""" -LangChain integration — Use OmniRoute A2A as a custom LLM. -""" -from langchain.llms.base import BaseLLM -from langchain.schema import LLMResult, Generation -import requests -from typing import List, Optional - -class OmniRouteA2A(BaseLLM): - base_url: str = "http://localhost:20128" - api_key: str = "" - model: str = "auto" - combo: Optional[str] = None - - @property - def _llm_type(self) -> str: - return "omniroute-a2a" - - def _call(self, prompt: str, stop: Optional[List[str]] = None, **kwargs) -> str: - response = requests.post( - f"{self.base_url}/a2a", - headers={ - "Content-Type": "application/json", - "Authorization": f"Bearer {self.api_key}", - }, - json={ - "jsonrpc": "2.0", - "id": "langchain-1", - "method": "message/send", - "params": { - "skill": "smart-routing", - "messages": [{"role": "user", "content": prompt}], - "metadata": { - "model": self.model, - **({"combo": self.combo} if self.combo else {}), - }, - }, - }, - ) - result = response.json()["result"] - return result["artifacts"][0]["content"] - - def _generate(self, prompts: List[str], stop=None, **kwargs) -> LLMResult: - return LLMResult( - generations=[[Generation(text=self._call(p, stop))] for p in prompts] - ) - -# Usage -llm = OmniRouteA2A( - base_url="http://localhost:20128", - api_key="your-key", - model="auto", - combo="fast-coding", -) -result = llm("Write a Python function to merge two sorted lists") -print(result) -``` - -### Go — A2A Client - -```go -package main - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" -) - -const baseURL = "http://localhost:20128" -const apiKey = "your-api-key" - -type JsonRpcRequest struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Method string `json:"method"` - Params interface{} `json:"params"` -} - -type JsonRpcResponse struct { - Jsonrpc string `json:"jsonrpc"` - ID string `json:"id"` - Result interface{} `json:"result"` - Error *struct { - Code int `json:"code"` - Message string `json:"message"` - } `json:"error"` -} - -func a2aCall(method string, params interface{}) (*JsonRpcResponse, error) { - body, _ := json.Marshal(JsonRpcRequest{ - Jsonrpc: "2.0", - ID: "go-1", - Method: method, - Params: params, - }) - - req, _ := http.NewRequest("POST", baseURL+"/a2a", bytes.NewReader(body)) - req.Header.Set("Content-Type", "application/json") - req.Header.Set("Authorization", "Bearer "+apiKey) - - resp, err := http.DefaultClient.Do(req) - if err != nil { - return nil, err - } - defer resp.Body.Close() - data, _ := io.ReadAll(resp.Body) - - var result JsonRpcResponse - json.Unmarshal(data, &result) - return &result, nil -} - -func main() { - // Discover agent - resp, _ := http.Get(baseURL + "/.well-known/agent.json") - defer resp.Body.Close() - body, _ := io.ReadAll(resp.Body) - fmt.Println("Agent Card:", string(body)) - - // Send smart-routing task - result, _ := a2aCall("message/send", map[string]interface{}{ - "skill": "smart-routing", - "messages": []map[string]string{{"role": "user", "content": "Hello from Go!"}}, - "metadata": map[string]interface{}{"model": "auto"}, - }) - out, _ := json.MarshalIndent(result.Result, "", " ") - fmt.Println("Result:", string(out)) -} -``` - ---- - -## Use Cases - -### 🤖 Use Case 1: Multi-Agent Coding Pipeline - -An orchestrator agent delegates code generation to OmniRoute, then passes the output to a review agent. - -```python -def coding_pipeline(task: str): - # Step 1: Generate code via OmniRoute A2A - code_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Write production-quality code: {task}"} - ], metadata={"model": "auto", "role": "coding"}) - code = code_result["artifacts"][0]["content"] - - # Step 2: Review the code via OmniRoute A2A (different model) - review_result = a2a_send("smart-routing", [ - {"role": "user", "content": f"Review this code for bugs and improvements:\n\n{code}"} - ], metadata={"model": "auto", "role": "review"}) - review = review_result["artifacts"][0]["content"] - - # Step 3: Check costs - print(f"Code cost: ${code_result['metadata']['cost_envelope']['actual']}") - print(f"Review cost: ${review_result['metadata']['cost_envelope']['actual']}") - - return {"code": code, "review": review} -``` - -### 💡 Use Case 2: Quota-Aware Agent Swarm - -Multiple agents share quota through OmniRoute, using the quota skill to coordinate. - -```python -async def quota_aware_agent(agent_name: str, task: str): - # Check quota before starting - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Which provider has the most quota remaining?"} - ]) - print(f"[{agent_name}] {quota['artifacts'][0]['content']}") - - # Send request with budget constraint - result = a2a_send("smart-routing", [ - {"role": "user", "content": task} - ], metadata={"budget": 0.05}) - - policy = result["metadata"]["policy_verdict"] - if not policy["allowed"]: - print(f"[{agent_name}] ⚠️ Budget exceeded: {policy['reason']}") - # Fall back to free combo - quota = a2a_send("quota-management", [ - {"role": "user", "content": "Suggest free combos"} - ]) - print(f"[{agent_name}] Free alternatives: {quota['artifacts'][0]['content']}") - - return result -``` - -### 📊 Use Case 3: Real-Time Streaming Dashboard - -A monitoring agent streams responses and displays progress in real-time. - -```typescript -async function streamingDashboard(prompt: string) { - const response = await fetch(`${BASE_URL}/a2a`, { - method: "POST", - headers: { "Content-Type": "application/json", Authorization: `Bearer ${API_KEY}` }, - body: JSON.stringify({ - jsonrpc: "2.0", - id: "dash-1", - method: "message/stream", - params: { skill: "smart-routing", messages: [{ role: "user", content: prompt }] }, - }), - }); - - let totalChunks = 0; - const reader = response.body!.getReader(); - const decoder = new TextDecoder(); - - while (true) { - const { done, value } = await reader.read(); - if (done) break; - - for (const line of decoder.decode(value).split("\n")) { - if (line.startsWith("data: ")) { - const event = JSON.parse(line.slice(6)); - const state = event.params.task.state; - - if (state === "working" && event.params.chunk) { - totalChunks++; - process.stdout.write( - `\r[Chunk ${totalChunks}] ${event.params.chunk.content.slice(0, 50)}...` - ); - } - if (state === "completed") { - const meta = event.params.metadata; - console.log( - `\n✅ Done | Cost: $${meta?.cost_envelope?.actual || 0} | Route: ${meta?.routing_explanation || "N/A"}` - ); - } - if (state === "failed") { - console.error(`\n❌ Failed: ${event.params.metadata?.error}`); - } - } - } - } -} -``` - -### 🔁 Use Case 4: Task Polling Pattern - -For long-running tasks, poll the task status instead of waiting synchronously. - -```python -import time - -def poll_task(task_id: str, timeout: int = 60): - """Poll task status until completion or timeout.""" - start = time.time() - while time.time() - start < timeout: - result = requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "poll-1", - "method": "tasks/get", - "params": {"taskId": task_id}, - }).json() - - task = result["result"]["task"] - state = task["state"] - print(f" Task {task_id[:8]}... state={state}") - - if state in ("completed", "failed", "cancelled"): - return task - time.sleep(2) - - # Timeout — cancel the task - requests.post(f"{BASE_URL}/a2a", headers=HEADERS, json={ - "jsonrpc": "2.0", - "id": "cancel-1", - "method": "tasks/cancel", - "params": {"taskId": task_id}, - }) - raise TimeoutError(f"Task {task_id} timed out after {timeout}s") -``` - ---- - -## Error Codes - -| Code | Constant | Meaning | -| ------ | ------------------------ | ---------------------------------------- | -| -32700 | — | Parse error (invalid JSON) | -| -32600 | `INVALID_REQUEST` | Invalid JSON-RPC request or unauthorized | -| -32601 | `METHOD_NOT_FOUND` | Unknown method or skill | -| -32602 | `INVALID_PARAMS` | Missing or invalid parameters | -| -32603 | `INTERNAL_ERROR` | Skill execution failed | -| -32001 | `TASK_NOT_FOUND` | Task ID not found | -| -32002 | `TASK_ALREADY_COMPLETED` | Cannot modify a completed task | -| -32003 | `UNAUTHORIZED` | Invalid or missing API key | -| -32004 | `BUDGET_EXCEEDED` | Request exceeds configured budget | -| -32005 | `PROVIDER_UNAVAILABLE` | No available providers | - ---- - -## Authentication - -All `/a2a` requests require a Bearer token via the `Authorization` header: - -``` -Authorization: Bearer YOUR_OMNIROUTE_API_KEY -``` - -If no API key is configured on the server (`OMNIROUTE_API_KEY` is empty), authentication is bypassed. - ---- - -## File Structure - -``` -src/lib/a2a/ -├── taskManager.ts # Task lifecycle (create/update/cancel/list), TTL, cleanup -├── taskExecution.ts # Generic task executor with state management -├── streaming.ts # SSE stream formatting, heartbeat, chunk/completion events -├── routingLogger.ts # Routing decision logger (stats, history, retention) -└── skills/ - ├── smartRouting.ts # Smart routing skill (routes via /v1/chat/completions) - └── quotaManagement.ts # Quota management skill (natural-language quota queries) - -src/app/a2a/ -└── route.ts # Next.js API route handler (JSON-RPC 2.0 dispatch) - -open-sse/mcp-server/ -└── schemas/a2a.ts # Zod schemas (AgentCard, Task, JSON-RPC, SSE events) -``` - ---- - -## Comparison: MCP vs A2A - -| Feature | MCP Server | A2A Server | -| ----------------- | ---------------------------- | ------------------------------------------------- | -| **Protocol** | Model Context Protocol | Agent-to-Agent Protocol v0.3 | -| **Transport** | stdio / HTTP | HTTP (JSON-RPC 2.0) | -| **Discovery** | Tool listing via MCP | `/.well-known/agent.json` | -| **Granularity** | 16 individual tools | 2 high-level skills | -| **Best for** | IDE agents (Cursor, VS Code) | Multi-agent systems (LangChain, CrewAI) | -| **Streaming** | Not supported | SSE via `message/stream` | -| **Task tracking** | No | Full lifecycle (submitted → completed) | -| **Observability** | Audit log per tool call | Cost envelope + resilience trace + policy verdict | - ---- - -## 许可证 - -Part of [OmniRoute](https://github.com/diegosouzapw/OmniRoute) — MIT License.