mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-01 21:02:12 +03:00
docs(i18n): remove incorrectly translated internal source and reporting folders
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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/`
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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`
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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/<id>`) → 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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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<T = any> {
|
||||
jsonrpc: "2.0";
|
||||
id: string | number;
|
||||
result?: T;
|
||||
error?: { code: number; message: string };
|
||||
}
|
||||
|
||||
async function a2aCall<T>(method: string, params: Record<string, any>): Promise<T> {
|
||||
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<T> = 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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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/`
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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`
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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/<id>`) → 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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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<T = any> {
|
||||
jsonrpc: "2.0";
|
||||
id: string | number;
|
||||
result?: T;
|
||||
error?: { code: number; message: string };
|
||||
}
|
||||
|
||||
async function a2aCall<T>(method: string, params: Record<string, any>): Promise<T> {
|
||||
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<T> = 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.
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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/`
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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`
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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
|
||||
@@ -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)
|
||||
@@ -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)
|
||||
@@ -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.
|
||||
@@ -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
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user