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> | |
| ); | |
| }; | |