diff --git a/package-lock.json b/package-lock.json index ef51b21a64..0ccbd9ba98 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "omniroute", - "version": "3.4.8", + "version": "3.4.9", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "omniroute", - "version": "3.4.8", + "version": "3.4.9", "hasInstallScript": true, "license": "MIT", "workspaces": [ diff --git a/package.json b/package.json index c54796d951..5bc5b88e48 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "omniroute", - "version": "3.4.8", + "version": "3.4.9", "description": "Smart AI Router with auto fallback — route to FREE & cheap models, zero downtime. Works with Cursor, Cline, Claude Desktop, Codex, and any OpenAI-compatible tool.", "type": "module", "bin": { diff --git a/src/app/(dashboard)/dashboard/auto-combo/page.tsx b/src/app/(dashboard)/dashboard/auto-combo/page.tsx index a3d68325c6..022b9cd96a 100644 --- a/src/app/(dashboard)/dashboard/auto-combo/page.tsx +++ b/src/app/(dashboard)/dashboard/auto-combo/page.tsx @@ -7,6 +7,7 @@ "use client"; import { useEffect, useState, useCallback } from "react"; +import { Card } from "@/shared/components"; interface ProviderScore { provider: string; @@ -152,102 +153,183 @@ export default function AutoComboDashboard() { ]; return ( -
-

⚡ Auto-Combo Engine

- - {/* Status Bar */} -
-
- {incidentMode ? "🚨 INCIDENT MODE" : "✅ Normal"} -
-
- Mode: {MODE_PACKS.find((m) => m.id === modePack)?.label || modePack} -
-
- - {/* Mode Pack Selector */} -
-

🎛️ Mode Pack

-
- {MODE_PACKS.map((mp) => ( - - ))} -
-
- - {/* Provider Scores */} -
-

📊 Provider Scores

- {scores.length === 0 ? ( -

- No auto-combo configured. Create one via POST /api/combos/auto. +

+
+
+

⚡ Auto-Combo Engine

+

+ Smart routing automatically adapting to latency, health, and throughput

- ) : ( -
- {scores.map((s) => ( -
-
- - {s.provider} / {s.model} - - {(s.score * 100).toFixed(0)}% -
- {/* Score Bar */} -
-
-
- {/* Factor Breakdown */} -
- {Object.entries(s.factors || {}).map(([key, val]) => ( - - {FACTOR_LABELS[key] || key}: {((val as number) * 100).toFixed(0)}% - - ))} -
-
- ))} -
- )} +
- {/* Exclusions */} -
-

🚫 Excluded Providers

- {exclusions.length === 0 ? ( -

No providers currently excluded.

- ) : ( -
- {exclusions.map((e) => ( + +
+
+

Status Overview

+
-
- {e.provider} - - Cooldown: {Math.round(e.cooldownMs / 60000)}min +
+ + {incidentMode ? "warning" : "check_circle"} +
+

+ {incidentMode ? "Incident Mode" : "Normal Operation"} +

+

+ {incidentMode + ? "High circuit breaker trip rate detected" + : "All providers reporting healthy metrics"} +

+
-

{e.reason}

- ))} + +
+
+ tune +
+

Active Mode Pack

+

+ {MODE_PACKS.find((m) => m.id === modePack)?.label || modePack} +

+
+
+
+
- )} + +
+

Mode Pack

+
+ {MODE_PACKS.map((mp) => ( + + ))} +
+
+
+ + +
+ +
+
+ +
+

Provider Scores

+
+ + {scores.length === 0 ? ( +

+ No auto-combo configured or data loading... Create one via{" "} + POST /api/combos/auto. +

+ ) : ( +
+ {scores.map((s) => ( +
+
+ + {s.provider} / {s.model} + + + {(s.score * 100).toFixed(0)}% + +
+ {/* Score Bar */} +
+
+
+ {/* Factor Breakdown */} +
+ {Object.entries(s.factors || {}).map(([key, val]) => ( +
+ {FACTOR_LABELS[key] || key}:{" "} + + {((val as number) * 100).toFixed(0)}% + +
+ ))} +
+
+ ))} +
+ )} + + + +
+
+ +
+

Excluded Providers

+
+ + {exclusions.length === 0 ? ( +
+ + verified + +

No providers currently excluded.

+
+ ) : ( +
+ {exclusions.map((e) => ( +
+
+
+ + {e.provider} + +
+ + Cooldown: {Math.round(e.cooldownMs / 60000)}m + +
+

+ info + {e.reason} +

+
+ ))} +
+ )} +
); diff --git a/src/i18n/messages/en.json b/src/i18n/messages/en.json index 9fd535b5d6..9bb077bb2f 100644 --- a/src/i18n/messages/en.json +++ b/src/i18n/messages/en.json @@ -1800,6 +1800,25 @@ "enablePassword": "Enable Password", "darkMode": "Dark Mode", "lightMode": "Light Mode", + "memoryTitle": "Memory", + "memoryDesc": "Persistent cross-session conversational memory", + "memoryEnabled": "Enable Memory", + "memoryEnabledDesc": "When enabled, OmniRoute will inject relevant past context.", + "maxTokens": "Max Tokens", + "retentionDays": "Retention", + "recent": "Recent", + "recentDesc": "Chronological window", + "semantic": "Semantic", + "semanticDesc": "Vector search", + "hybrid": "Hybrid", + "hybridDesc": "Recent + Semantic", + "skillsTitle": "Skills", + "skillsDesc": "Tools for models", + "skillsEnabled": "Enable Skills", + "skillsEnabledDesc": "Allows agents to trigger functions.", + "skillsComingSoon": "Skills marketplace coming soon.", + "memorySkillsTitle": "Memory & Skills", + "memorySkillsDesc": "Persistent context & capabilities", "systemTheme": "System Theme", "debugToggle": "Enable Debug Mode", "sidebarVisibilityToggle": "Show Sidebar Items", diff --git a/src/shared/constants/routingStrategies.ts b/src/shared/constants/routingStrategies.ts index 18d6529db7..988beb9820 100644 --- a/src/shared/constants/routingStrategies.ts +++ b/src/shared/constants/routingStrategies.ts @@ -84,6 +84,8 @@ export const ROUTING_STRATEGIES: RoutingStrategyOption[] = [ ]; export const SETTINGS_FALLBACK_STRATEGY_VALUES: RoutingStrategyValue[] = [ + "priority", + "weighted", "fill-first", "round-robin", "p2c",