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>
|