auto select model on provider disabled
Browse files
app/components/chat/ModelSelector.tsx
CHANGED
|
@@ -1,7 +1,6 @@
|
|
| 1 |
import type { ProviderInfo } from '~/types/model';
|
| 2 |
import type { ModelInfo } from '~/utils/types';
|
| 3 |
-
import { useEffect
|
| 4 |
-
import Cookies from 'js-cookie';
|
| 5 |
|
| 6 |
interface ModelSelectorProps {
|
| 7 |
model?: string;
|
|
@@ -22,62 +21,28 @@ export const ModelSelector = ({
|
|
| 22 |
providerList,
|
| 23 |
}: ModelSelectorProps) => {
|
| 24 |
// Load enabled providers from cookies
|
| 25 |
-
const [enabledProviders, setEnabledProviders] = useState(() => {
|
| 26 |
-
const savedProviders = Cookies.get('providers');
|
| 27 |
-
|
| 28 |
-
if (savedProviders) {
|
| 29 |
-
try {
|
| 30 |
-
const parsedProviders = JSON.parse(savedProviders);
|
| 31 |
-
return providerList.filter((p) => parsedProviders[p.name]);
|
| 32 |
-
} catch (error) {
|
| 33 |
-
console.error('Failed to parse providers from cookies:', error);
|
| 34 |
-
return providerList;
|
| 35 |
-
}
|
| 36 |
-
}
|
| 37 |
-
|
| 38 |
-
return providerList;
|
| 39 |
-
});
|
| 40 |
|
| 41 |
// Update enabled providers when cookies change
|
| 42 |
useEffect(() => {
|
| 43 |
-
//
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
if (savedProviders) {
|
| 48 |
-
try {
|
| 49 |
-
const parsedProviders = JSON.parse(savedProviders);
|
| 50 |
-
const newEnabledProviders = providerList.filter((p) => parsedProviders[p.name]);
|
| 51 |
-
setEnabledProviders(newEnabledProviders);
|
| 52 |
|
| 53 |
-
|
| 54 |
-
|
| 55 |
-
|
| 56 |
-
setProvider?.(firstEnabledProvider);
|
| 57 |
|
| 58 |
-
|
| 59 |
-
|
| 60 |
|
| 61 |
-
|
| 62 |
-
|
| 63 |
-
}
|
| 64 |
-
}
|
| 65 |
-
} catch (error) {
|
| 66 |
-
console.error('Failed to parse providers from cookies:', error);
|
| 67 |
-
}
|
| 68 |
}
|
| 69 |
-
}
|
| 70 |
-
|
| 71 |
-
// Initial update
|
| 72 |
-
updateProvidersFromCookies();
|
| 73 |
-
|
| 74 |
-
// Set up an interval to check for cookie changes
|
| 75 |
-
const interval = setInterval(updateProvidersFromCookies, 1000);
|
| 76 |
-
|
| 77 |
-
return () => clearInterval(interval);
|
| 78 |
}, [providerList, provider, setProvider, modelList, setModel]);
|
| 79 |
|
| 80 |
-
if (
|
| 81 |
return (
|
| 82 |
<div className="mb-2 p-4 rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background text-bolt-elements-textPrimary">
|
| 83 |
<p className="text-center">
|
|
@@ -93,7 +58,7 @@ export const ModelSelector = ({
|
|
| 93 |
<select
|
| 94 |
value={provider?.name ?? ''}
|
| 95 |
onChange={(e) => {
|
| 96 |
-
const newProvider =
|
| 97 |
|
| 98 |
if (newProvider && setProvider) {
|
| 99 |
setProvider(newProvider);
|
|
@@ -107,7 +72,7 @@ export const ModelSelector = ({
|
|
| 107 |
}}
|
| 108 |
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"
|
| 109 |
>
|
| 110 |
-
{
|
| 111 |
<option key={provider.name} value={provider.name}>
|
| 112 |
{provider.name}
|
| 113 |
</option>
|
|
|
|
| 1 |
import type { ProviderInfo } from '~/types/model';
|
| 2 |
import type { ModelInfo } from '~/utils/types';
|
| 3 |
+
import { useEffect } from 'react';
|
|
|
|
| 4 |
|
| 5 |
interface ModelSelectorProps {
|
| 6 |
model?: string;
|
|
|
|
| 21 |
providerList,
|
| 22 |
}: ModelSelectorProps) => {
|
| 23 |
// Load enabled providers from cookies
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
|
| 25 |
// Update enabled providers when cookies change
|
| 26 |
useEffect(() => {
|
| 27 |
+
// If current provider is disabled, switch to first enabled provider
|
| 28 |
+
if (providerList.length == 0) {
|
| 29 |
+
return;
|
| 30 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
|
| 32 |
+
if (provider && !providerList.map((p) => p.name).includes(provider.name)) {
|
| 33 |
+
const firstEnabledProvider = providerList[0];
|
| 34 |
+
setProvider?.(firstEnabledProvider);
|
|
|
|
| 35 |
|
| 36 |
+
// Also update the model to the first available one for the new provider
|
| 37 |
+
const firstModel = modelList.find((m) => m.provider === firstEnabledProvider.name);
|
| 38 |
|
| 39 |
+
if (firstModel) {
|
| 40 |
+
setModel?.(firstModel.name);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
}
|
| 42 |
+
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
}, [providerList, provider, setProvider, modelList, setModel]);
|
| 44 |
|
| 45 |
+
if (providerList.length === 0) {
|
| 46 |
return (
|
| 47 |
<div className="mb-2 p-4 rounded-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background text-bolt-elements-textPrimary">
|
| 48 |
<p className="text-center">
|
|
|
|
| 58 |
<select
|
| 59 |
value={provider?.name ?? ''}
|
| 60 |
onChange={(e) => {
|
| 61 |
+
const newProvider = providerList.find((p: ProviderInfo) => p.name === e.target.value);
|
| 62 |
|
| 63 |
if (newProvider && setProvider) {
|
| 64 |
setProvider(newProvider);
|
|
|
|
| 72 |
}}
|
| 73 |
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"
|
| 74 |
>
|
| 75 |
+
{providerList.map((provider: ProviderInfo) => (
|
| 76 |
<option key={provider.name} value={provider.name}>
|
| 77 |
{provider.name}
|
| 78 |
</option>
|