feat(dashboard): Gemini Available Models reads from API sync, hide Custom Models

This commit is contained in:
Chris Staley
2026-04-02 11:41:28 -06:00
parent 5c27e0f9ef
commit 125fb81fa3
2 changed files with 54 additions and 2 deletions

View File

@@ -835,6 +835,7 @@ export default function ProviderDetailPage() {
customModels: CompatModelRow[];
modelCompatOverrides: Array<CompatModelRow & { id: string }>;
}>({ customModels: [], modelCompatOverrides: [] });
const [syncedAvailableModels, setSyncedAvailableModels] = useState<any[]>([]);
const [compatSavingModelId, setCompatSavingModelId] = useState<string | null>(null);
const [applyingCodexAuthId, setApplyingCodexAuthId] = useState<string | null>(null);
const [exportingCodexAuthId, setExportingCodexAuthId] = useState<string | null>(null);
@@ -873,7 +874,11 @@ export default function ProviderDetailPage() {
(OAUTH_PROVIDERS as any)[providerId] ||
(APIKEY_PROVIDERS as any)[providerId];
const isOAuth = !!(FREE_PROVIDERS as any)[providerId] || !!(OAUTH_PROVIDERS as any)[providerId];
const models = getModelsByProviderId(providerId);
const registryModels = getModelsByProviderId(providerId);
// For Gemini: use synced API models if available, otherwise fall back to registry
const models = providerId === "gemini" && syncedAvailableModels.length > 0
? syncedAvailableModels
: registryModels;
const providerAlias = getProviderAlias(providerId);
const isManagedAvailableModelsProvider = isCompatible || providerId === "openrouter";
const isSearchProvider = providerId.endsWith("-search");
@@ -906,6 +911,20 @@ export default function ProviderDetailPage() {
customModels: data.models || [],
modelCompatOverrides: data.modelCompatOverrides || [],
});
// Fetch synced available models for Gemini
if (providerId === "gemini") {
try {
const syncRes = await fetch("/api/synced-available-models?provider=gemini", {
cache: "no-store",
});
if (syncRes.ok) {
const syncData = await syncRes.json();
setSyncedAvailableModels(syncData.models || []);
}
} catch {
// Non-critical
}
}
} catch (e) {
console.error("fetchProviderModelMeta", e);
}
@@ -2432,7 +2451,7 @@ export default function ProviderDetailPage() {
{renderModelsSection()}
{/* Custom Models — available for providers without managed available-model metadata */}
{!isManagedAvailableModelsProvider && (
{!isManagedAvailableModelsProvider && providerId !== "gemini" && (
<CustomModelsSection
providerId={providerId}
providerAlias={providerDisplayAlias}

View File

@@ -0,0 +1,33 @@
import { getSyncedAvailableModels, getAllSyncedAvailableModels } from "@/lib/db/models";
import { isAuthenticated } from "@/shared/utils/apiAuth";
/**
* GET /api/synced-available-models?provider=<id>
* List synced available models for a provider (or all providers).
*/
export async function GET(request: Request) {
try {
if (!(await isAuthenticated(request))) {
return Response.json(
{ error: { message: "Authentication required", type: "invalid_api_key" } },
{ status: 401 }
);
}
const { searchParams } = new URL(request.url);
const provider = searchParams.get("provider");
if (provider) {
const models = await getSyncedAvailableModels(provider);
return Response.json({ models });
}
const allModels = await getAllSyncedAvailableModels();
return Response.json(allModels);
} catch {
return Response.json(
{ error: { message: "Failed to fetch synced available models", type: "server_error" } },
{ status: 500 }
);
}
}