12
12
// See the License for the specific language governing permissions and
13
13
// limitations under the License.
14
14
15
- import React , { useEffect } from "react"
15
+ import React , { useState , useEffect } from "react"
16
16
import { fetchAllChatModels , fetchAllEngines } from "@/utils/api"
17
17
import { useQuery } from "@tanstack/react-query"
18
18
import Loading from "@/navigation/Loading"
@@ -25,20 +25,46 @@ interface ConfigurationProps {
25
25
const QueryConfiguration : React . FC < ConfigurationProps > = ( { token } ) => {
26
26
const { data : engineList , isLoading : enginesLoading , error : enginesError } = useQuery ( [ "fetchEngines" ] , fetchAllEngines ( token ) )
27
27
const { data : modelList , isLoading : modelsLoading , error : modelsError } = useQuery ( [ "fetchModels" ] , fetchAllChatModels ( token ) )
28
+ const { data : multimodalModelList , isLoading : multimodalModelsLoading , error : multimodalModelsError } =
29
+ useQuery ( [ "fetchMultimodalModels" ] , fetchAllChatModels ( token , true ) )
28
30
29
31
const { selectedModel, setSelectedModel, selectedEngine, setSelectedEngine } = useConfig ( )
32
+ const [ selectedEngineIsMultimodal , setSelectedEngineIsMultimodal ] = useState < boolean | undefined > ( undefined )
30
33
31
34
useEffect ( ( ) => {
32
35
if ( engineList && engineList . length > 0 && ! selectedEngine ) {
33
36
setSelectedEngine ( engineList [ 0 ] . id )
34
37
}
35
- } , [ engineList , selectedEngine , setSelectedEngine ] )
38
+ } , [ engineList ] )
36
39
37
- if ( enginesError || modelsError ) return < > </ >
38
- if ( enginesLoading || modelsLoading ) {
40
+ // Changing if the engine is multimodal when a new one is selected
41
+ useEffect ( ( ) => {
42
+ if ( selectedEngine && engineList ) {
43
+ const engineInfo = engineList . find (
44
+ ( engine ) => engine . id == selectedEngine )
45
+ // if the engine isn't in the list, reset to the first one in the list
46
+ if ( ! engineInfo ) { setSelectedEngine ( engineList [ 0 ] . id ) }
47
+ else {
48
+ setSelectedEngineIsMultimodal (
49
+ ( engineInfo . params ?. is_multimodal ?? false ) === "True" )
50
+ }
51
+ }
52
+ } , [ selectedEngine ] )
53
+
54
+ const displayModelList = selectedEngineIsMultimodal ? multimodalModelList : modelList
55
+ // resetting the chat model if it is no longer valid when the engine changes
56
+ useEffect ( ( ) => {
57
+ if ( displayModelList !== undefined && ! displayModelList . includes ( selectedModel ) &&
58
+ displayModelList . length > 0 ) {
59
+ setSelectedModel ( displayModelList [ 0 ] )
60
+ }
61
+ } , [ selectedEngineIsMultimodal ] )
62
+
63
+ if ( enginesError || modelsError || multimodalModelsLoading ) return < > </ >
64
+ if ( enginesLoading || modelsLoading || multimodalModelsError ) {
39
65
return < Loading />
40
66
}
41
-
67
+
42
68
return (
43
69
< div className = "border-primary-content mt-2 border-t p-2 py-3" >
44
70
< div className = "text-primary-content pb-3 font-semibold" >
@@ -53,8 +79,8 @@ const QueryConfiguration: React.FC<ConfigurationProps> = ({ token }) => {
53
79
onChange = { ( e ) => setSelectedModel ( e . target . value ) }
54
80
value = { selectedModel }
55
81
>
56
- { modelList &&
57
- modelList . map ( ( modelOpt ) => < option key = { modelOpt } value = { modelOpt } > { modelOpt } </ option > )
82
+ { displayModelList &&
83
+ displayModelList . map ( ( modelOpt ) => < option key = { modelOpt } value = { modelOpt } > { modelOpt } </ option > )
58
84
}
59
85
</ select >
60
86
< label htmlFor = "engine-select" className = "label w-fit pt-3" > < span className = "label-text text-primary-content" > Query Engine:</ span > </ label >
0 commit comments