diff --git a/ui/src/components/cliproxy/ai-providers/provider-entry-card.tsx b/ui/src/components/cliproxy/ai-providers/provider-entry-card.tsx index 7457caae..941ac32b 100644 --- a/ui/src/components/cliproxy/ai-providers/provider-entry-card.tsx +++ b/ui/src/components/cliproxy/ai-providers/provider-entry-card.tsx @@ -1,5 +1,6 @@ import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; +import { getRequestedModelId } from '@/lib/provider-config'; import { cn } from '@/lib/utils'; import type { AiProviderEntryView, @@ -241,9 +242,13 @@ export function ProviderEntryCard({ key={`${model.name}:${model.alias}`} className="rounded-md border bg-muted/20 px-3 py-2" > - {model.name} - → - {model.alias} + {getRequestedModelId(model)} + {model.alias.trim() ? ( + <> + → + {model.name} + > + ) : null} ))} diff --git a/ui/src/components/cliproxy/ai-providers/provider-entry-dialog.tsx b/ui/src/components/cliproxy/ai-providers/provider-entry-dialog.tsx index e6b54c0b..d3dfc74c 100644 --- a/ui/src/components/cliproxy/ai-providers/provider-entry-dialog.tsx +++ b/ui/src/components/cliproxy/ai-providers/provider-entry-dialog.tsx @@ -3,6 +3,7 @@ import { ProviderLogo } from '@/components/cliproxy/provider-logo'; import { formatRequestedUpstreamModelRules, getAiProviderFamilyVisual, + getRequestedUpstreamModelRuleErrors, parseRequestedUpstreamModelRules, } from '@/lib/provider-config'; import { Badge } from '@/components/ui/badge'; @@ -284,6 +285,10 @@ export function ProviderEntryDialog({ const [headers, setHeaders] = useState(() => formatHeaders(entry)); const [excludedModels, setExcludedModels] = useState(() => formatExcludedModels(entry)); const [modelAliases, setModelAliases] = useState(() => formatModelAliases(entry)); + const modelRuleErrors = useMemo( + () => getRequestedUpstreamModelRuleErrors(modelAliases), + [modelAliases] + ); const [advancedOpen, setAdvancedOpen] = useState(() => Boolean( entry?.headers.length || entry?.excludedModels.length || entry?.proxyUrl || entry?.prefix @@ -298,6 +303,10 @@ export function ProviderEntryDialog({ }, [entry?.secretConfigured, isEditing, supportsOpenAiCompat]); const handleSubmit = async () => { + if (modelRuleErrors.length > 0) { + return; + } + const nextApiKey = apiKey.trim(); const nextApiKeys = parseDelimitedLines(apiKeys); const preserveSecrets = @@ -459,6 +468,9 @@ export function ProviderEntryDialog({ placeholder={guide.aliasesPlaceholder} />
{guide.aliasesHelper}
+ {modelRuleErrors.length > 0 ? ( +{modelRuleErrors[0]}
+ ) : null} @@ -560,7 +572,11 @@ export function ProviderEntryDialog({ -