Eduards commited on
Commit
9396734
·
1 Parent(s): e55fb57

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={MODEL_LIST}
196
  provider={provider}
197
  setProvider={setProvider}
198
- providerList={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: string) => {
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();