feat(models): expose refreshClaudeModels to bust cache and re-fetch from 9router
This commit is contained in:
parent
7ed22b9077
commit
e7514c08cc
1 changed files with 31 additions and 25 deletions
|
|
@ -90,32 +90,37 @@ export function useChatProviderState({ selectedSession }: UseChatProviderStateAr
|
|||
load('gemini', setGeminiModelState, GEMINI_MODELS.DEFAULT);
|
||||
}, [selectedSession?.id]);
|
||||
|
||||
// Fetch live Claude model list and validate the current claude model
|
||||
useEffect(() => {
|
||||
authenticatedFetch('/api/models')
|
||||
.then((res) => {
|
||||
if (!res.ok) return;
|
||||
return res.json();
|
||||
})
|
||||
.then((data) => {
|
||||
if (!Array.isArray(data?.claude) || data.claude.length === 0) return;
|
||||
const options: ModelOption[] = data.claude;
|
||||
setClaudeModelOptions(options);
|
||||
// Fetch and apply live Claude model list, validating the current selection.
|
||||
const fetchAndSetClaudeModels = useCallback(async () => {
|
||||
const res = await authenticatedFetch('/api/models');
|
||||
if (!res.ok) return;
|
||||
const data = await res.json();
|
||||
if (!Array.isArray(data?.claude) || data.claude.length === 0) return;
|
||||
const options: ModelOption[] = data.claude;
|
||||
setClaudeModelOptions(options);
|
||||
setClaudeModelState((current) => {
|
||||
const valid = options.some((o) => o.value === current);
|
||||
if (valid) return current;
|
||||
const fallback = options[0]?.value ?? CLAUDE_MODELS.DEFAULT;
|
||||
localStorage.setItem(globalModelKey('claude'), fallback);
|
||||
if (selectedSession?.id) {
|
||||
localStorage.setItem(sessionModelKey('claude', selectedSession.id), fallback);
|
||||
}
|
||||
return fallback;
|
||||
});
|
||||
}, [selectedSession?.id]);
|
||||
|
||||
setClaudeModelState((current) => {
|
||||
const valid = options.some((o) => o.value === current);
|
||||
if (valid) return current;
|
||||
const fallback = options[0]?.value ?? CLAUDE_MODELS.DEFAULT;
|
||||
localStorage.setItem(globalModelKey('claude'), fallback);
|
||||
if (selectedSession?.id) {
|
||||
localStorage.setItem(sessionModelKey('claude', selectedSession.id), fallback);
|
||||
}
|
||||
return fallback;
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
// Static fallback already in place
|
||||
});
|
||||
// Bust the server-side cache then re-fetch the model list.
|
||||
const refreshClaudeModels = useCallback(async () => {
|
||||
await authenticatedFetch('/api/models/refresh', { method: 'POST' });
|
||||
await fetchAndSetClaudeModels();
|
||||
}, [fetchAndSetClaudeModels]);
|
||||
|
||||
// Fetch live Claude model list on mount
|
||||
useEffect(() => {
|
||||
fetchAndSetClaudeModels().catch(() => {
|
||||
// Static fallback already in place
|
||||
});
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, []);
|
||||
|
||||
|
|
@ -209,5 +214,6 @@ export function useChatProviderState({ selectedSession }: UseChatProviderStateAr
|
|||
pendingPermissionRequests,
|
||||
setPendingPermissionRequests,
|
||||
cyclePermissionMode,
|
||||
refreshClaudeModels,
|
||||
};
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue