2025-12-15 18:11:38 +02:00
|
|
|
import React from 'react';
|
|
|
|
|
import { useConfigStore } from '@/stores/useConfigStore';
|
|
|
|
|
import { useUIStore } from '@/stores/useUIStore';
|
2026-01-03 13:39:59 +02:00
|
|
|
import type { Provider } from '@opencode-ai/sdk/v2';
|
2025-12-15 18:11:38 +02:00
|
|
|
|
|
|
|
|
type ProviderModel = Provider["models"][string];
|
|
|
|
|
type ProviderWithModelList = Omit<Provider, "models"> & { models: ProviderModel[] };
|
|
|
|
|
|
|
|
|
|
export interface ModelListItem {
|
|
|
|
|
provider: ProviderWithModelList;
|
|
|
|
|
model: ProviderModel;
|
|
|
|
|
providerID: string;
|
|
|
|
|
modelID: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const useModelLists = () => {
|
|
|
|
|
const { providers } = useConfigStore();
|
|
|
|
|
const { favoriteModels, recentModels } = useUIStore();
|
|
|
|
|
|
|
|
|
|
const favoriteModelsList = React.useMemo(() => {
|
|
|
|
|
return favoriteModels
|
|
|
|
|
.map(({ providerID, modelID }) => {
|
|
|
|
|
const provider = providers.find((p) => p.id === providerID);
|
|
|
|
|
if (!provider) return null;
|
|
|
|
|
const providerModels = Array.isArray(provider.models) ? provider.models : [];
|
|
|
|
|
const model = providerModels.find((m: ProviderModel) => m.id === modelID);
|
|
|
|
|
if (!model) return null;
|
|
|
|
|
return { provider, model, providerID, modelID };
|
|
|
|
|
})
|
|
|
|
|
.filter((item): item is ModelListItem => item !== null);
|
|
|
|
|
}, [favoriteModels, providers]);
|
|
|
|
|
|
|
|
|
|
const recentModelsList = React.useMemo(() => {
|
|
|
|
|
return recentModels
|
|
|
|
|
.map(({ providerID, modelID }) => {
|
|
|
|
|
const provider = providers.find((p) => p.id === providerID);
|
|
|
|
|
if (!provider) return null;
|
|
|
|
|
const providerModels = Array.isArray(provider.models) ? provider.models : [];
|
|
|
|
|
const model = providerModels.find((m: ProviderModel) => m.id === modelID);
|
|
|
|
|
if (!model) return null;
|
|
|
|
|
return { provider, model, providerID, modelID };
|
|
|
|
|
})
|
|
|
|
|
.filter((item): item is ModelListItem => item !== null)
|
|
|
|
|
.filter(({ providerID, modelID }) =>
|
|
|
|
|
!favoriteModels.some(fav => fav.providerID === providerID && fav.modelID === modelID)
|
|
|
|
|
);
|
|
|
|
|
}, [recentModels, providers, favoriteModels]);
|
|
|
|
|
|
|
|
|
|
return { favoriteModelsList, recentModelsList };
|
|
|
|
|
};
|