Various bug fixes around model/provider selection
Browse files
app/components/chat/BaseChat.tsx
CHANGED
@@ -7,7 +7,7 @@ import { Menu } from '~/components/sidebar/Menu.client';
|
|
7 |
import { IconButton } from '~/components/ui/IconButton';
|
8 |
import { Workbench } from '~/components/workbench/Workbench.client';
|
9 |
import { classNames } from '~/utils/classNames';
|
10 |
-
import { MODEL_LIST, DEFAULT_PROVIDER, PROVIDER_LIST, ProviderInfo } from '~/utils/constants';
|
11 |
import { Messages } from './Messages.client';
|
12 |
import { SendButton } from './SendButton.client';
|
13 |
import { useState } from 'react';
|
@@ -45,8 +45,10 @@ const ModelSelector = ({ model, setModel, provider, setProvider, modelList, prov
|
|
45 |
))}
|
46 |
</select>
|
47 |
<select
|
|
|
48 |
value={model}
|
49 |
onChange={(e) => setModel(e.target.value)}
|
|
|
50 |
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"
|
51 |
>
|
52 |
{[...modelList]
|
@@ -111,6 +113,8 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
|
|
111 |
console.log(provider);
|
112 |
const TEXTAREA_MAX_HEIGHT = chatStarted ? 400 : 200;
|
113 |
const [apiKeys, setApiKeys] = useState<Record<string, string>>({});
|
|
|
|
|
114 |
|
115 |
useEffect(() => {
|
116 |
// Load API keys from cookies on component mount
|
@@ -127,6 +131,10 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
|
|
127 |
// Clear invalid cookie data
|
128 |
Cookies.remove('apiKeys');
|
129 |
}
|
|
|
|
|
|
|
|
|
130 |
}, []);
|
131 |
|
132 |
const updateApiKey = (provider: string, key: string) => {
|
@@ -190,12 +198,13 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
|
|
190 |
})}
|
191 |
>
|
192 |
<ModelSelector
|
|
|
193 |
model={model}
|
194 |
setModel={setModel}
|
195 |
-
modelList={
|
196 |
provider={provider}
|
197 |
setProvider={setProvider}
|
198 |
-
providerList={
|
199 |
/>
|
200 |
{provider &&
|
201 |
<APIKeyManager
|
|
|
7 |
import { IconButton } from '~/components/ui/IconButton';
|
8 |
import { Workbench } from '~/components/workbench/Workbench.client';
|
9 |
import { classNames } from '~/utils/classNames';
|
10 |
+
import { MODEL_LIST, DEFAULT_PROVIDER, PROVIDER_LIST, ProviderInfo, initializeModelList } from '~/utils/constants';
|
11 |
import { Messages } from './Messages.client';
|
12 |
import { SendButton } from './SendButton.client';
|
13 |
import { useState } from 'react';
|
|
|
45 |
))}
|
46 |
</select>
|
47 |
<select
|
48 |
+
key={provider?.name}
|
49 |
value={model}
|
50 |
onChange={(e) => setModel(e.target.value)}
|
51 |
+
style={{maxWidth: "70%"}}
|
52 |
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"
|
53 |
>
|
54 |
{[...modelList]
|
|
|
113 |
console.log(provider);
|
114 |
const TEXTAREA_MAX_HEIGHT = chatStarted ? 400 : 200;
|
115 |
const [apiKeys, setApiKeys] = useState<Record<string, string>>({});
|
116 |
+
const [modelList, setModelList] = useState(MODEL_LIST);
|
117 |
+
|
118 |
|
119 |
useEffect(() => {
|
120 |
// Load API keys from cookies on component mount
|
|
|
131 |
// Clear invalid cookie data
|
132 |
Cookies.remove('apiKeys');
|
133 |
}
|
134 |
+
|
135 |
+
initializeModelList().then(modelList => {
|
136 |
+
setModelList(modelList);
|
137 |
+
});
|
138 |
}, []);
|
139 |
|
140 |
const updateApiKey = (provider: string, key: string) => {
|
|
|
198 |
})}
|
199 |
>
|
200 |
<ModelSelector
|
201 |
+
key={provider?.name + ':' + modelList.length}
|
202 |
model={model}
|
203 |
setModel={setModel}
|
204 |
+
modelList={modelList}
|
205 |
provider={provider}
|
206 |
setProvider={setProvider}
|
207 |
+
providerList={PROVIDER_LIST}
|
208 |
/>
|
209 |
{provider &&
|
210 |
<APIKeyManager
|
app/components/chat/Chat.client.tsx
CHANGED
@@ -11,7 +11,7 @@ import { useChatHistory } from '~/lib/persistence';
|
|
11 |
import { chatStore } from '~/lib/stores/chat';
|
12 |
import { workbenchStore } from '~/lib/stores/workbench';
|
13 |
import { fileModificationsToHTML } from '~/utils/diff';
|
14 |
-
import { DEFAULT_MODEL, DEFAULT_PROVIDER } from '~/utils/constants';
|
15 |
import { cubicEasingFn } from '~/utils/easings';
|
16 |
import { createScopedLogger, renderLogger } from '~/utils/logger';
|
17 |
import { BaseChat } from './BaseChat';
|
@@ -80,7 +80,7 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
|
|
80 |
});
|
81 |
const [provider, setProvider] = useState(() => {
|
82 |
const savedProvider = Cookies.get('selectedProvider');
|
83 |
-
return savedProvider || DEFAULT_PROVIDER;
|
84 |
});
|
85 |
|
86 |
const { showChat } = useStore(chatStore);
|
@@ -96,7 +96,7 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
|
|
96 |
},
|
97 |
onError: (error) => {
|
98 |
logger.error('Request failed\n\n', error);
|
99 |
-
toast.error('There was an error processing your request');
|
100 |
},
|
101 |
onFinish: () => {
|
102 |
logger.debug('Finished streaming');
|
@@ -227,9 +227,9 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
|
|
227 |
Cookies.set('selectedModel', newModel, { expires: 30 });
|
228 |
};
|
229 |
|
230 |
-
const handleProviderChange = (newProvider:
|
231 |
setProvider(newProvider);
|
232 |
-
Cookies.set('selectedProvider', newProvider, { expires: 30 });
|
233 |
};
|
234 |
|
235 |
return (
|
@@ -263,7 +263,7 @@ export const ChatImpl = memo(({ initialMessages, storeMessageHistory }: ChatProp
|
|
263 |
})}
|
264 |
enhancePrompt={() => {
|
265 |
enhancePrompt(
|
266 |
-
input,
|
267 |
(input) => {
|
268 |
setInput(input);
|
269 |
scrollTextArea();
|
|
|
11 |
import { chatStore } from '~/lib/stores/chat';
|
12 |
import { workbenchStore } from '~/lib/stores/workbench';
|
13 |
import { fileModificationsToHTML } from '~/utils/diff';
|
14 |
+
import { DEFAULT_MODEL, DEFAULT_PROVIDER, PROVIDER_LIST, ProviderInfo } from '~/utils/constants';
|
15 |
import { cubicEasingFn } from '~/utils/easings';
|
16 |
import { createScopedLogger, renderLogger } from '~/utils/logger';
|
17 |
import { BaseChat } from './BaseChat';
|
|
|
80 |
});
|
81 |
const [provider, setProvider] = useState(() => {
|
82 |
const savedProvider = Cookies.get('selectedProvider');
|
83 |
+
return PROVIDER_LIST.find(p => p.name === savedProvider) || DEFAULT_PROVIDER;
|
84 |
});
|
85 |
|
86 |
const { showChat } = useStore(chatStore);
|
|
|
96 |
},
|
97 |
onError: (error) => {
|
98 |
logger.error('Request failed\n\n', error);
|
99 |
+
toast.error('There was an error processing your request: ' + (error.message ? error.message : "No details were returned"));
|
100 |
},
|
101 |
onFinish: () => {
|
102 |
logger.debug('Finished streaming');
|
|
|
227 |
Cookies.set('selectedModel', newModel, { expires: 30 });
|
228 |
};
|
229 |
|
230 |
+
const handleProviderChange = (newProvider: ProviderInfo) => {
|
231 |
setProvider(newProvider);
|
232 |
+
Cookies.set('selectedProvider', newProvider.name, { expires: 30 });
|
233 |
};
|
234 |
|
235 |
return (
|
|
|
263 |
})}
|
264 |
enhancePrompt={() => {
|
265 |
enhancePrompt(
|
266 |
+
input,
|
267 |
(input) => {
|
268 |
setInput(input);
|
269 |
scrollTextArea();
|