({
providers,
models,
value,
onChange,
disabled = false,
loading = false,
error = null,
filterFunctionCalling = false,
placeholder = "Select model...",
loadingPlaceholder = "Loading models...",
errorPlaceholder = "Error loading models",
emptyPlaceholder = "No models available"
}: ModelProviderComboboxProps)
| 42 | } |
| 43 | |
| 44 | export function ModelProviderCombobox({ |
| 45 | providers, |
| 46 | models, |
| 47 | value, |
| 48 | onChange, |
| 49 | disabled = false, |
| 50 | loading = false, |
| 51 | error = null, |
| 52 | filterFunctionCalling = false, |
| 53 | placeholder = "Select model...", |
| 54 | loadingPlaceholder = "Loading models...", |
| 55 | errorPlaceholder = "Error loading models", |
| 56 | emptyPlaceholder = "No models available" |
| 57 | }: ModelProviderComboboxProps) { |
| 58 | const [comboboxOpen, setComboboxOpen] = useState(false); |
| 59 | |
| 60 | const getProviderIcon = useCallback((providerKey: ModelProviderKey | undefined): React.ReactNode | null => { |
| 61 | const PROVIDER_ICONS: Record<ModelProviderKey, React.ComponentType<{ className?: string }>> = { |
| 62 | 'OpenAI': OpenAI, |
| 63 | 'Anthropic': Anthropic, |
| 64 | 'Ollama': Ollama, |
| 65 | 'AzureOpenAI': Azure, |
| 66 | 'Gemini': Gemini, |
| 67 | 'GeminiVertexAI': Gemini, |
| 68 | 'AnthropicVertexAI': Anthropic, |
| 69 | 'Bedrock': Bedrock, |
| 70 | 'SAPAICore': SAPAICore, |
| 71 | }; |
| 72 | if (!providerKey || !PROVIDER_ICONS[providerKey]) { |
| 73 | return null; |
| 74 | } |
| 75 | const IconComponent = PROVIDER_ICONS[providerKey]; |
| 76 | return <IconComponent className="h-4 w-4 mr-2 shrink-0" />; |
| 77 | }, []); |
| 78 | |
| 79 | const groupedProviderModelOptions = useMemo(() => { |
| 80 | if (!providers || !models || providers.length === 0 || Object.keys(models).length === 0) { |
| 81 | return {}; |
| 82 | } |
| 83 | |
| 84 | const groups: { [groupName: string]: ComboboxOption[] } = {}; |
| 85 | providers.forEach(provider => { |
| 86 | let providerFormKey: ModelProviderKey; |
| 87 | if (isValidProviderInfoKey(provider.name)) { |
| 88 | providerFormKey = provider.name; |
| 89 | } else { |
| 90 | console.warn(`Unsupported provider name found: ${provider.name}`); |
| 91 | return; |
| 92 | } |
| 93 | |
| 94 | if (!isValidProviderInfoKey(providerFormKey)) return; |
| 95 | |
| 96 | let providerModels: ProviderModel[] = []; |
| 97 | |
| 98 | if (models[providerFormKey]) { |
| 99 | providerModels = models[providerFormKey] |
| 100 | .filter(m => filterFunctionCalling ? m.function_calling === true : true); |
| 101 | } |
nothing calls this directly
no test coverage detected