Fix model display name not being updated immediately after leaving settings (#3587)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
import { useEffect, useState, useCallback } from 'react';
|
import { useEffect, useState, useCallback, useRef } from 'react';
|
||||||
import type { View } from '../../../App';
|
import type { View } from '../../../App';
|
||||||
import ModelSettingsButtons from './subcomponents/ModelSettingsButtons';
|
import ModelSettingsButtons from './subcomponents/ModelSettingsButtons';
|
||||||
import { useConfig } from '../../ConfigContext';
|
import { useConfig } from '../../ConfigContext';
|
||||||
@@ -18,14 +18,16 @@ export default function ModelsSection({ setView }: ModelsSectionProps) {
|
|||||||
const [displayModelName, setDisplayModelName] = useState<string>('');
|
const [displayModelName, setDisplayModelName] = useState<string>('');
|
||||||
const [isLoading, setIsLoading] = useState<boolean>(true);
|
const [isLoading, setIsLoading] = useState<boolean>(true);
|
||||||
const { read, getProviders } = useConfig();
|
const { read, getProviders } = useConfig();
|
||||||
const { getCurrentModelDisplayName, getCurrentProviderDisplayName } = useModelAndProvider();
|
const {
|
||||||
|
getCurrentModelDisplayName,
|
||||||
|
getCurrentProviderDisplayName,
|
||||||
|
currentModel,
|
||||||
|
currentProvider,
|
||||||
|
} = useModelAndProvider();
|
||||||
|
|
||||||
// Function to load model data
|
|
||||||
const loadModelData = useCallback(async () => {
|
const loadModelData = useCallback(async () => {
|
||||||
try {
|
try {
|
||||||
setIsLoading(true);
|
setIsLoading(true);
|
||||||
const gooseProvider = (await read('GOOSE_PROVIDER', false)) as string;
|
|
||||||
const providers = await getProviders(true);
|
|
||||||
|
|
||||||
// Get display name (alias if available, otherwise model name)
|
// Get display name (alias if available, otherwise model name)
|
||||||
const modelDisplayName = await getCurrentModelDisplayName();
|
const modelDisplayName = await getCurrentModelDisplayName();
|
||||||
@@ -37,6 +39,8 @@ export default function ModelsSection({ setView }: ModelsSectionProps) {
|
|||||||
setProvider(providerDisplayName);
|
setProvider(providerDisplayName);
|
||||||
} else {
|
} else {
|
||||||
// Fallback to original provider lookup
|
// Fallback to original provider lookup
|
||||||
|
const gooseProvider = (await read('GOOSE_PROVIDER', false)) as string;
|
||||||
|
const providers = await getProviders(true);
|
||||||
const providerDetailsList = providers.filter((provider) => provider.name === gooseProvider);
|
const providerDetailsList = providers.filter((provider) => provider.name === gooseProvider);
|
||||||
|
|
||||||
if (providerDetailsList.length != 1) {
|
if (providerDetailsList.length != 1) {
|
||||||
@@ -59,8 +63,23 @@ export default function ModelsSection({ setView }: ModelsSectionProps) {
|
|||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
loadModelData();
|
loadModelData();
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
}, [loadModelData]);
|
||||||
}, []);
|
|
||||||
|
// Update display when model or provider changes - but only if they actually changed
|
||||||
|
const prevModelRef = useRef<string | null>(null);
|
||||||
|
const prevProviderRef = useRef<string | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (
|
||||||
|
currentModel &&
|
||||||
|
currentProvider &&
|
||||||
|
(currentModel !== prevModelRef.current || currentProvider !== prevProviderRef.current)
|
||||||
|
) {
|
||||||
|
prevModelRef.current = currentModel;
|
||||||
|
prevProviderRef.current = currentProvider;
|
||||||
|
loadModelData();
|
||||||
|
}
|
||||||
|
}, [currentModel, currentProvider, loadModelData]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<section id="models" className="space-y-4 pr-4">
|
<section id="models" className="space-y-4 pr-4">
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import React, { useEffect, useState } from 'react';
|
import React, { useEffect, useState, useRef } from 'react';
|
||||||
import Model from '../modelInterface';
|
import Model from '../modelInterface';
|
||||||
import { useRecentModels } from './recentModels';
|
import { useRecentModels } from './recentModels';
|
||||||
import { useModelAndProvider } from '../../../ModelAndProviderContext';
|
import { useModelAndProvider } from '../../../ModelAndProviderContext';
|
||||||
@@ -29,7 +29,8 @@ export function BaseModelsList({
|
|||||||
} else {
|
} else {
|
||||||
modelList = providedModelList;
|
modelList = providedModelList;
|
||||||
}
|
}
|
||||||
const { changeModel, getCurrentModelAndProvider } = useModelAndProvider();
|
const { changeModel, getCurrentModelAndProvider, currentModel, currentProvider } =
|
||||||
|
useModelAndProvider();
|
||||||
const [selectedModel, setSelectedModel] = useState<Model | null>(null);
|
const [selectedModel, setSelectedModel] = useState<Model | null>(null);
|
||||||
const [isInitialized, setIsInitialized] = useState(false);
|
const [isInitialized, setIsInitialized] = useState(false);
|
||||||
|
|
||||||
@@ -119,6 +120,33 @@ export function BaseModelsList({
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Update selected model when context changes - but only if they actually changed
|
||||||
|
const prevModelRef = useRef<string | null>(null);
|
||||||
|
const prevProviderRef = useRef<string | null>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
if (
|
||||||
|
currentModel &&
|
||||||
|
currentProvider &&
|
||||||
|
isInitialized &&
|
||||||
|
(currentModel !== prevModelRef.current || currentProvider !== prevProviderRef.current)
|
||||||
|
) {
|
||||||
|
prevModelRef.current = currentModel;
|
||||||
|
prevProviderRef.current = currentProvider;
|
||||||
|
|
||||||
|
const match = modelList.find(
|
||||||
|
(model) => model.name === currentModel && model.provider === currentProvider
|
||||||
|
);
|
||||||
|
|
||||||
|
if (match) {
|
||||||
|
setSelectedModel(match);
|
||||||
|
} else {
|
||||||
|
// Create a model object if not found in list
|
||||||
|
setSelectedModel({ name: currentModel, provider: currentProvider });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, [currentModel, currentProvider, modelList, isInitialized]);
|
||||||
|
|
||||||
// Don't render until we've loaded the initial model/provider
|
// Don't render until we've loaded the initial model/provider
|
||||||
if (!isInitialized) {
|
if (!isInitialized) {
|
||||||
return <div>Loading models...</div>;
|
return <div>Loading models...</div>;
|
||||||
|
|||||||
Reference in New Issue
Block a user