mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-02 21:32:10 +03:00
feat(combo): response quality validation, circuit breaker fix, Cursor 4.6 models (#762)
- Add `validateResponseQuality()` to detect empty/invalid 200 responses from upstream providers in combo routing. Non-streaming responses with empty body, invalid JSON, or missing content/tool_calls now trigger circuit breaker failure and fallback to the next model instead of being returned to the client. - Add missing `breaker._onSuccess()` calls in both priority and round-robin combo paths. Previously failures accumulated without reset, causing premature circuit breaker trips on healthy models. - Update Cursor provider registry with Claude 4.6 model IDs (opus-high, sonnet-high, haiku, opus + thinking variants). Keep 4.5 IDs for backward compatibility. - Update free-stack preset: replace duplicate qw/qwen3-coder-plus with if/deepseek-v3.2 for better model diversity. - Add paid-premium combo template for round-robin load distribution across paid subscription providers (Cursor, Antigravity). Made-with: Cursor
This commit is contained in:
committed by
GitHub
parent
46acd16999
commit
93bbe8e7a8
@@ -186,6 +186,9 @@ const COMBO_TEMPLATE_FALLBACK = {
|
||||
freeStackTitle: "Free Stack ($0)",
|
||||
freeStackDesc:
|
||||
"Round-robin across all free providers: Kiro, iFlow, Qwen, Gemini CLI. Zero cost, never stops.",
|
||||
paidPremiumTitle: "Paid Premium",
|
||||
paidPremiumDesc:
|
||||
"Round-robin across paid subscriptions: Cursor, Antigravity. Top-tier models, distributed load.",
|
||||
};
|
||||
|
||||
const COMBO_TEMPLATES = [
|
||||
@@ -250,6 +253,21 @@ const COMBO_TEMPLATES = [
|
||||
healthCheckEnabled: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "paid-premium",
|
||||
icon: "workspace_premium",
|
||||
titleKey: "templatePaidPremium",
|
||||
descKey: "templatePaidPremiumDesc",
|
||||
fallbackTitle: COMBO_TEMPLATE_FALLBACK.paidPremiumTitle,
|
||||
fallbackDesc: COMBO_TEMPLATE_FALLBACK.paidPremiumDesc,
|
||||
strategy: "round-robin",
|
||||
suggestedName: "paid-premium",
|
||||
config: {
|
||||
maxRetries: 2,
|
||||
retryDelayMs: 1000,
|
||||
healthCheckEnabled: true,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
function getStrategyMeta(strategy) {
|
||||
@@ -1425,18 +1443,27 @@ function ComboFormModal({ isOpen, combo, onClose, onSave, activeProviders }) {
|
||||
{ model: "kr/claude-sonnet-4.5", weight: 0 },
|
||||
{ model: "if/kimi-k2-thinking", weight: 0 },
|
||||
{ model: "if/qwen3-coder-plus", weight: 0 },
|
||||
{ model: "qw/qwen3-coder-plus", weight: 0 },
|
||||
{ model: "if/deepseek-v3.2", weight: 0 },
|
||||
{ model: "nvidia/llama-3.3-70b-instruct", weight: 0 },
|
||||
{ model: "groq/llama-3.3-70b-versatile", weight: 0 },
|
||||
];
|
||||
|
||||
const PAID_PREMIUM_PRESET_MODELS = [
|
||||
{ model: "cu/claude-4.6-opus-high", weight: 0 },
|
||||
{ model: "ag/claude-sonnet-4-6", weight: 0 },
|
||||
{ model: "cu/claude-4.6-sonnet-high", weight: 0 },
|
||||
{ model: "ag/gpt-5", weight: 0 },
|
||||
{ model: "ag/gemini-3.1-pro-preview", weight: 0 },
|
||||
];
|
||||
|
||||
const applyTemplate = (template) => {
|
||||
setStrategy(template.strategy);
|
||||
setConfig((prev) => ({ ...prev, ...template.config }));
|
||||
if (!name.trim()) setName(template.suggestedName);
|
||||
// Pre-fill Free Stack with 7 real free provider models
|
||||
if (template.id === "free-stack") {
|
||||
setModels(FREE_STACK_PRESET_MODELS);
|
||||
} else if (template.id === "paid-premium") {
|
||||
setModels(PAID_PREMIUM_PRESET_MODELS);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user