Spaces:
Sleeping
Sleeping
import type { ProviderInfo } from '~/types/model'; | |
import type { ModelInfo } from '~/utils/types'; | |
interface ModelSelectorProps { | |
model?: string; | |
setModel?: (model: string) => void; | |
provider?: ProviderInfo; | |
setProvider?: (provider: ProviderInfo) => void; | |
modelList: ModelInfo[]; | |
providerList: ProviderInfo[]; | |
apiKeys: Record<string, string>; | |
} | |
export const ModelSelector = ({ | |
model, | |
setModel, | |
provider, | |
setProvider, | |
modelList, | |
providerList, | |
}: ModelSelectorProps) => { | |
return ( | |
<div className="mb-2 flex gap-2 flex-col sm:flex-row"> | |
<select | |
value={provider?.name ?? ''} | |
onChange={(e) => { | |
const newProvider = providerList.find((p: ProviderInfo) => p.name === e.target.value); | |
if (newProvider && setProvider) { | |
setProvider(newProvider); | |
} | |
const firstModel = [...modelList].find((m) => m.provider === e.target.value); | |
if (firstModel && setModel) { | |
setModel(firstModel.name); | |
} | |
}} | |
className="flex-1 p-2 rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background text-bolt-elements-textPrimary focus:outline-none focus:ring-2 focus:ring-bolt-elements-focus transition-all" | |
> | |
{providerList.map((provider: ProviderInfo) => ( | |
<option key={provider.name} value={provider.name}> | |
{provider.name} | |
</option> | |
))} | |
</select> | |
<select | |
key={provider?.name} | |
value={model} | |
onChange={(e) => setModel?.(e.target.value)} | |
className="flex-1 p-2 rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background text-bolt-elements-textPrimary focus:outline-none focus:ring-2 focus:ring-bolt-elements-focus transition-all lg:max-w-[70%]" | |
> | |
{[...modelList] | |
.filter((e) => e.provider == provider?.name && e.name) | |
.map((modelOption) => ( | |
<option key={modelOption.name} value={modelOption.name}> | |
{modelOption.label} | |
</option> | |
))} | |
</select> | |
</div> | |
); | |
}; | |