@@ -7,14 +7,15 @@ import { Menu } from '~/components/sidebar/Menu.client';
77import { IconButton } from '~/components/ui/IconButton' ;
88import { Workbench } from '~/components/workbench/Workbench.client' ;
99import { classNames } from '~/utils/classNames' ;
10- import { MODEL_LIST , DEFAULT_PROVIDER } from '~/utils/constants' ;
10+ import { MODEL_LIST , DEFAULT_PROVIDER , PROVIDER_LIST , initializeModelList } from '~/utils/constants' ;
1111import { Messages } from './Messages.client' ;
1212import { SendButton } from './SendButton.client' ;
1313import { useState } from 'react' ;
1414import { APIKeyManager } from './APIKeyManager' ;
1515import Cookies from 'js-cookie' ;
1616
1717import styles from './BaseChat.module.scss' ;
18+ import type { ProviderInfo } from '~/utils/types' ;
1819
1920const EXAMPLE_PROMPTS = [
2021 { text : 'Build a todo app in React using Tailwind' } ,
@@ -24,42 +25,35 @@ const EXAMPLE_PROMPTS = [
2425 { text : 'How do I center a div?' } ,
2526] ;
2627
27- const providerList = [ ... new Set ( MODEL_LIST . map ( ( model ) => model . provider ) ) ] ;
28+ const providerList = PROVIDER_LIST ;
2829
2930const ModelSelector = ( { model, setModel, provider, setProvider, modelList, providerList } ) => {
3031 return (
3132 < div className = "mb-2 flex gap-2" >
3233 < select
33- value = { provider }
34+ value = { provider ?. name }
3435 onChange = { ( e ) => {
35- setProvider ( e . target . value ) ;
36+ setProvider ( providerList . find ( p => p . name === e . target . value ) ) ;
3637 const firstModel = [ ...modelList ] . find ( ( m ) => m . provider == e . target . value ) ;
3738 setModel ( firstModel ? firstModel . name : '' ) ;
3839 } }
3940 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"
4041 >
4142 { providerList . map ( ( provider ) => (
42- < option key = { provider } value = { provider } >
43- { provider }
43+ < option key = { provider . name } value = { provider . name } >
44+ { provider . name }
4445 </ option >
4546 ) ) }
46- < option key = "Ollama" value = "Ollama" >
47- Ollama
48- </ option >
49- < option key = "OpenAILike" value = "OpenAILike" >
50- OpenAILike
51- </ option >
52- < option key = "LMStudio" value = "LMStudio" >
53- LMStudio
54- </ option >
5547 </ select >
5648 < select
49+ key = { provider ?. name }
5750 value = { model }
5851 onChange = { ( e ) => setModel ( e . target . value ) }
52+ style = { { maxWidth : "70%" } }
5953 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"
6054 >
6155 { [ ...modelList ]
62- . filter ( ( e ) => e . provider == provider && e . name )
56+ . filter ( ( e ) => e . provider == provider ?. name && e . name )
6357 . map ( ( modelOption ) => (
6458 < option key = { modelOption . name } value = { modelOption . name } >
6559 { modelOption . label }
@@ -85,8 +79,8 @@ interface BaseChatProps {
8579 input ?: string ;
8680 model ?: string ;
8781 setModel ?: ( model : string ) => void ;
88- provider ?: string ;
89- setProvider ?: ( provider : string ) => void ;
82+ provider ?: ProviderInfo ;
83+ setProvider ?: ( provider : ProviderInfo ) => void ;
9084 handleStop ?: ( ) => void ;
9185 sendMessage ?: ( event : React . UIEvent , messageInput ?: string ) => void ;
9286 handleInputChange ?: ( event : React . ChangeEvent < HTMLTextAreaElement > ) => void ;
@@ -117,8 +111,11 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
117111 } ,
118112 ref ,
119113 ) => {
114+ console . log ( provider ) ;
120115 const TEXTAREA_MAX_HEIGHT = chatStarted ? 400 : 200 ;
121116 const [ apiKeys , setApiKeys ] = useState < Record < string , string > > ( { } ) ;
117+ const [ modelList , setModelList ] = useState ( MODEL_LIST ) ;
118+
122119
123120 useEffect ( ( ) => {
124121 // Load API keys from cookies on component mount
@@ -135,6 +132,10 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
135132 // Clear invalid cookie data
136133 Cookies . remove ( 'apiKeys' ) ;
137134 }
135+
136+ initializeModelList ( ) . then ( modelList => {
137+ setModelList ( modelList ) ;
138+ } ) ;
138139 } , [ ] ) ;
139140
140141 const updateApiKey = ( provider : string , key : string ) => {
@@ -198,18 +199,20 @@ export const BaseChat = React.forwardRef<HTMLDivElement, BaseChatProps>(
198199 } ) }
199200 >
200201 < ModelSelector
202+ key = { provider ?. name + ':' + modelList . length }
201203 model = { model }
202204 setModel = { setModel }
203- modelList = { MODEL_LIST }
205+ modelList = { modelList }
204206 provider = { provider }
205207 setProvider = { setProvider }
206- providerList = { providerList }
207- />
208- < APIKeyManager
209- provider = { provider }
210- apiKey = { apiKeys [ provider ] || '' }
211- setApiKey = { ( key ) => updateApiKey ( provider , key ) }
208+ providerList = { PROVIDER_LIST }
212209 />
210+ { provider &&
211+ < APIKeyManager
212+ provider = { provider }
213+ apiKey = { apiKeys [ provider . name ] || '' }
214+ setApiKey = { ( key ) => updateApiKey ( provider . name , key ) }
215+ /> }
213216 < div
214217 className = { classNames (
215218 'shadow-lg border border-bolt-elements-borderColor bg-bolt-elements-prompt-background backdrop-filter backdrop-blur-[8px] rounded-lg overflow-hidden transition-all' ,
0 commit comments