11"use client" ;
2- import { WellKnownLLMProviderDescriptor } from "@/app/admin/configuration/llm/interfaces" ;
2+ import {
3+ WellKnownLLMProviderDescriptor ,
4+ LLMProviderDescriptor ,
5+ } from "@/app/admin/configuration/llm/interfaces" ;
36import React , {
47 createContext ,
58 useContext ,
@@ -8,57 +11,101 @@ import React, {
811 useCallback ,
912} from "react" ;
1013import { useUser } from "@/providers/UserProvider" ;
11- import { useRouter } from "next/navigation" ;
12- import { checkLlmProvider } from "../initialSetup/welcome/lib" ;
14+ import { useLLMProviders } from "@/lib/hooks/useLLMProviders" ;
15+ import { useLLMProviderOptions } from "@/lib/hooks/useLLMProviderOptions" ;
16+ import { testDefaultProvider as testDefaultProviderSvc } from "@/lib/llm/svc" ;
1317
1418interface ProviderContextType {
1519 shouldShowConfigurationNeeded : boolean ;
1620 providerOptions : WellKnownLLMProviderDescriptor [ ] ;
17- refreshProviderInfo : ( ) => Promise < void > ; // Add this line
21+ refreshProviderInfo : ( ) => Promise < void > ;
22+ // Expose configured provider instances for components that need it (e.g., onboarding)
23+ llmProviders : LLMProviderDescriptor [ ] | undefined ;
24+ isLoadingProviders : boolean ;
25+ hasProviders : boolean ;
1826}
1927
2028const ProviderContext = createContext < ProviderContextType | undefined > (
2129 undefined
2230) ;
2331
32+ const DEFAULT_LLM_PROVIDER_TEST_COMPLETE_KEY = "defaultLlmProviderTestComplete" ;
33+
34+ function checkDefaultLLMProviderTestComplete ( ) {
35+ if ( typeof window === "undefined" ) return true ;
36+ return (
37+ localStorage . getItem ( DEFAULT_LLM_PROVIDER_TEST_COMPLETE_KEY ) === "true"
38+ ) ;
39+ }
40+
41+ function setDefaultLLMProviderTestComplete ( ) {
42+ if ( typeof window === "undefined" ) return ;
43+ localStorage . setItem ( DEFAULT_LLM_PROVIDER_TEST_COMPLETE_KEY , "true" ) ;
44+ }
45+
2446export function ProviderContextProvider ( {
2547 children,
2648} : {
2749 children : React . ReactNode ;
2850} ) {
2951 const { user } = useUser ( ) ;
30- const router = useRouter ( ) ;
3152
32- const [ validProviderExists , setValidProviderExists ] = useState < boolean > ( true ) ;
33- const [ providerOptions , setProviderOptions ] = useState <
34- WellKnownLLMProviderDescriptor [ ]
35- > ( [ ] ) ;
53+ // Use SWR hooks instead of raw fetch
54+ const {
55+ llmProviders,
56+ isLoading : isLoadingProviders ,
57+ refetch : refetchProviders ,
58+ } = useLLMProviders ( ) ;
59+ const { llmProviderOptions : providerOptions , refetch : refetchOptions } =
60+ useLLMProviderOptions ( ) ;
3661
37- const fetchProviderInfo = useCallback ( async ( ) => {
38- const { providers, options, defaultCheckSuccessful } =
39- await checkLlmProvider ( user ) ;
62+ const [ defaultCheckSuccessful , setDefaultCheckSuccessful ] =
63+ useState < boolean > ( true ) ;
4064
41- setValidProviderExists ( providers . length > 0 && defaultCheckSuccessful ) ;
42- setProviderOptions ( options ) ;
43- } , [ user , setValidProviderExists , setProviderOptions ] ) ;
65+ // Test the default provider - only runs if test hasn't passed yet
66+ const testDefaultProvider = useCallback ( async ( ) => {
67+ const shouldCheck =
68+ ! checkDefaultLLMProviderTestComplete ( ) &&
69+ ( ! user || user . role === "admin" ) ;
4470
71+ if ( shouldCheck ) {
72+ const success = await testDefaultProviderSvc ( ) ;
73+ setDefaultCheckSuccessful ( success ) ;
74+ if ( success ) {
75+ setDefaultLLMProviderTestComplete ( ) ;
76+ }
77+ }
78+ } , [ user ] ) ;
79+
80+ // Test default provider on mount
4581 useEffect ( ( ) => {
46- fetchProviderInfo ( ) ;
47- } , [ router , user , fetchProviderInfo ] ) ;
82+ testDefaultProvider ( ) ;
83+ } , [ testDefaultProvider ] ) ;
84+
85+ const hasProviders = ( llmProviders ?. length ?? 0 ) > 0 ;
86+ const validProviderExists = hasProviders && defaultCheckSuccessful ;
4887
4988 const shouldShowConfigurationNeeded =
50- ! validProviderExists && providerOptions . length > 0 ;
89+ ! validProviderExists && ( providerOptions ? .length ?? 0 ) > 0 ;
5190
52- const refreshProviderInfo = async ( ) => {
53- await fetchProviderInfo ( ) ;
54- } ;
91+ const refreshProviderInfo = useCallback ( async ( ) => {
92+ // Refetch provider lists and re-test default provider if needed
93+ await Promise . all ( [
94+ refetchProviders ( ) ,
95+ refetchOptions ( ) ,
96+ testDefaultProvider ( ) ,
97+ ] ) ;
98+ } , [ refetchProviders , refetchOptions , testDefaultProvider ] ) ;
5599
56100 return (
57101 < ProviderContext . Provider
58102 value = { {
59103 shouldShowConfigurationNeeded,
60- providerOptions,
61- refreshProviderInfo, // Add this line
104+ providerOptions : providerOptions ?? [ ] ,
105+ refreshProviderInfo,
106+ llmProviders,
107+ isLoadingProviders,
108+ hasProviders,
62109 } }
63110 >
64111 { children }
0 commit comments