Skip to content

Commit 11f2e90

Browse files
committed
fix: hide mux-gateway models and only show cloud for supported providers
- Filter out mux-gateway provider from custom models list in settings - Filter out mux-gateway models from model LRU list - Only show cloud icon for providers that gateway supports (anthropic, openai, google) - Add isGatewaySupported() check in toGatewayModel for extra robustness
1 parent 2b75760 commit 11f2e90

File tree

4 files changed

+49
-12
lines changed

4 files changed

+49
-12
lines changed

src/browser/components/ModelSelector.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { cn } from "@/common/lib/utils";
1010
import { Cloud, Settings, Star } from "lucide-react";
1111
import { TooltipWrapper, Tooltip } from "./Tooltip";
1212
import { useSettings } from "@/browser/contexts/SettingsContext";
13-
import { useGatewayModels } from "@/browser/hooks/useGatewayModels";
13+
import { useGatewayModels, isGatewaySupported } from "@/browser/hooks/useGatewayModels";
1414

1515
interface ModelSelectorProps {
1616
value: string;
@@ -196,7 +196,8 @@ export const ModelSelector = forwardRef<ModelSelectorRef, ModelSelectorProps>(
196196
}, [highlightedIndex]);
197197

198198
if (!isEditing) {
199-
const gatewayEnabled = isGatewayEnabled(value) && gatewayAvailable;
199+
const gatewayEnabled =
200+
isGatewayEnabled(value) && gatewayAvailable && isGatewaySupported(value);
200201
return (
201202
<div ref={containerRef} className="relative flex items-center gap-1">
202203
{gatewayEnabled && (
@@ -268,8 +269,8 @@ export const ModelSelector = forwardRef<ModelSelectorRef, ModelSelectorProps>(
268269
<div className="grid w-full grid-cols-[1fr_auto] items-center gap-2">
269270
<span className="min-w-0 truncate">{model}</span>
270271
<div className="flex items-center gap-0.5">
271-
{/* Gateway toggle - only show when gateway is configured */}
272-
{gatewayAvailable && (
272+
{/* Gateway toggle - only show when gateway is configured and model's provider is supported */}
273+
{gatewayAvailable && isGatewaySupported(model) && (
273274
<TooltipWrapper inline>
274275
<button
275276
type="button"

src/browser/components/Settings/sections/ModelsSection.tsx

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,14 @@ import { Plus, Loader2 } from "lucide-react";
33
import { SUPPORTED_PROVIDERS, PROVIDER_DISPLAY_NAMES } from "@/common/constants/providers";
44
import { KNOWN_MODELS } from "@/common/constants/knownModels";
55
import { useModelLRU } from "@/browser/hooks/useModelLRU";
6-
import { useGatewayModels } from "@/browser/hooks/useGatewayModels";
6+
import { useGatewayModels, isGatewaySupported } from "@/browser/hooks/useGatewayModels";
77
import { ModelRow } from "./ModelRow";
88
import { useAPI } from "@/browser/contexts/API";
99
import { useProvidersConfig } from "@/browser/hooks/useProvidersConfig";
1010

11+
// Providers to exclude from the custom models UI (handled specially or internal)
12+
const HIDDEN_PROVIDERS = new Set(["mux-gateway"]);
13+
1114
interface NewModelForm {
1215
provider: string;
1316
modelId: string;
@@ -131,10 +134,12 @@ export function ModelsSection() {
131134
);
132135
}
133136

134-
// Get all custom models across providers
137+
// Get all custom models across providers (excluding hidden providers like mux-gateway)
135138
const getCustomModels = (): Array<{ provider: string; modelId: string; fullId: string }> => {
136139
const models: Array<{ provider: string; modelId: string; fullId: string }> = [];
137140
for (const [provider, providerConfig] of Object.entries(config)) {
141+
// Skip hidden providers (mux-gateway models are accessed via the cloud toggle, not listed separately)
142+
if (HIDDEN_PROVIDERS.has(provider)) continue;
138143
if (providerConfig.models) {
139144
for (const modelId of providerConfig.models) {
140145
models.push({ provider, modelId, fullId: `${provider}:${modelId}` });
@@ -228,7 +233,11 @@ export function ModelsSection() {
228233
setEditing((prev) => (prev ? { ...prev, newModelId: value } : null))
229234
}
230235
onRemove={() => handleRemoveModel(model.provider, model.modelId)}
231-
onToggleGateway={gatewayAvailable ? () => toggleGateway(model.fullId) : undefined}
236+
onToggleGateway={
237+
gatewayAvailable && isGatewaySupported(model.fullId)
238+
? () => toggleGateway(model.fullId)
239+
: undefined
240+
}
232241
/>
233242
);
234243
})}
@@ -251,7 +260,11 @@ export function ModelsSection() {
251260
isEditing={false}
252261
isGatewayEnabled={isGatewayEnabled(model.fullId)}
253262
onSetDefault={() => setDefaultModel(model.fullId)}
254-
onToggleGateway={gatewayAvailable ? () => toggleGateway(model.fullId) : undefined}
263+
onToggleGateway={
264+
gatewayAvailable && isGatewaySupported(model.fullId)
265+
? () => toggleGateway(model.fullId)
266+
: undefined
267+
}
255268
/>
256269
))}
257270
</div>

src/browser/hooks/useGatewayModels.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,23 @@ import { useProvidersConfig } from "./useProvidersConfig";
55
const GATEWAY_MODELS_KEY = "gateway-models";
66
const GATEWAY_AVAILABLE_KEY = "gateway-available";
77

8+
/**
9+
* Providers that Mux Gateway supports routing to.
10+
* Only models from these providers can use the gateway toggle.
11+
*/
12+
const GATEWAY_SUPPORTED_PROVIDERS = new Set(["anthropic", "openai", "google"]);
13+
14+
/**
15+
* Check if a model's provider is supported by Mux Gateway.
16+
* @param modelId Full model ID (e.g., "anthropic:claude-opus-4-5")
17+
*/
18+
export function isGatewaySupported(modelId: string): boolean {
19+
const colonIndex = modelId.indexOf(":");
20+
if (colonIndex === -1) return false;
21+
const provider = modelId.slice(0, colonIndex);
22+
return GATEWAY_SUPPORTED_PROVIDERS.has(provider);
23+
}
24+
825
/**
926
* Check if a model is gateway-enabled (static read, no reactivity)
1027
*/
@@ -21,13 +38,17 @@ export function isGatewayAvailable(): boolean {
2138
}
2239

2340
/**
24-
* Transform a model ID to gateway format if gateway is enabled AND available.
25-
* Falls back to direct provider if gateway is not configured.
41+
* Transform a model ID to gateway format if gateway is enabled AND available AND supported.
42+
* Falls back to direct provider if:
43+
* - Gateway is not configured (no coupon code)
44+
* - User hasn't enabled gateway for this model
45+
* - Provider is not supported by gateway
46+
*
2647
* Example: "anthropic:claude-opus-4-5" → "mux-gateway:anthropic/claude-opus-4-5"
2748
*/
2849
export function toGatewayModel(modelId: string): string {
29-
// Only transform if user enabled gateway for this model AND gateway is configured
30-
if (!isGatewayEnabled(modelId) || !isGatewayAvailable()) {
50+
// Only transform if user enabled gateway for this model, gateway is configured, and provider is supported
51+
if (!isGatewayEnabled(modelId) || !isGatewayAvailable() || !isGatewaySupported(modelId)) {
3152
return modelId;
3253
}
3354
// Transform provider:model to mux-gateway:provider/model

src/browser/hooks/useModelLRU.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ export function useModelLRU() {
8585
const providerConfig = await api.providers.getConfig();
8686
const models: string[] = [];
8787
for (const [provider, config] of Object.entries(providerConfig)) {
88+
// Skip mux-gateway - those models are accessed via the cloud toggle, not listed separately
89+
if (provider === "mux-gateway") continue;
8890
if (config.models) {
8991
for (const modelId of config.models) {
9092
// Format as provider:modelId for consistency

0 commit comments

Comments
 (0)