1010# Track which environment variables are used for each LLM
1111_llms_env_vars : dict [str , list [str ]] = {}
1212
13+ # Cache for available LLMs (computed once at first use)
14+ _available_llms_cache : dict [str , LLM | AsyncOpenAI ] | None = None
15+
1316
1417def get_llm_provider (provider_name : str | None = None ) -> LLM | AsyncOpenAI | None :
1518 """
@@ -50,6 +53,30 @@ def _check_env(*var_names: str) -> bool:
5053 return all (os .getenv (var ) for var in var_names )
5154
5255
56+ def get_cached_available_llms () -> dict [str , LLM | AsyncOpenAI ]:
57+ """
58+ Get cached LLMs or compute and cache them on first call.
59+
60+ This avoids repeatedly scanning environment variables on every access.
61+ Call refresh_llm_cache() if you need to reload the configuration.
62+ """
63+ global _available_llms_cache
64+ if _available_llms_cache is None :
65+ _available_llms_cache = get_available_llms ()
66+ return _available_llms_cache
67+
68+
69+ def refresh_llm_cache () -> dict [str , LLM | AsyncOpenAI ]:
70+ """
71+ Force refresh the LLM cache.
72+
73+ Call this if environment variables change at runtime.
74+ """
75+ global _available_llms_cache
76+ _available_llms_cache = None
77+ return get_cached_available_llms ()
78+
79+
5380def _get_llm_params (model : str ) -> dict :
5481 """
5582 Get provider-specific LLM parameters based on the model name.
@@ -108,23 +135,6 @@ def get_available_llms() -> dict[str, LLM | AsyncOpenAI]:
108135 )
109136 _llms_env_vars ["ollama_llm" ] = ["OLLAMA_MODEL_ID" ]
110137
111- # OpenAI LLM
112- if _check_env ("OPENAI_API_KEY" ):
113- openai_llm = LLM (
114- model = os .getenv ("OPENAI_MODEL_ID" , "openai/gpt-4" ),
115- server_url = os .getenv ("OPENAI_BASE_URL" ),
116- temperature = 0.8 ,
117- top_p = 0.9 ,
118- stop = ["END" ],
119- api_key = os .getenv ("OPENAI_API_KEY" ),
120- seed = 42 ,
121- )
122- llms ["openai_llm" ] = openai_llm
123- llms ["openai" ] = openai_llm
124- env_vars = ["OPENAI_API_KEY" , "OPENAI_MODEL_ID" ]
125- _llms_env_vars ["openai_llm" ] = env_vars
126- _llms_env_vars ["openai" ] = env_vars
127-
128138 # OpenAI Compatible LLM
129139 if _check_env (
130140 "OPENAI_COMPATIBLE_API_KEY" ,
@@ -149,23 +159,6 @@ def get_available_llms() -> dict[str, LLM | AsyncOpenAI]:
149159 _llms_env_vars ["openai_compatible_llm" ] = env_vars
150160 _llms_env_vars ["openai_compatible" ] = env_vars
151161
152- # WatsonX LLM
153- if _check_env ("WATSONX_APIKEY" , "WATSONX_URL" , "WATSONX_PROJECTID" , "MODEL_ID" ):
154- watsonx_llm = LLM (
155- model = os .getenv ("MODEL_ID" ),
156- base_url = os .getenv ("WATSONX_URL" ),
157- project_id = os .getenv ("WATSONX_PROJECTID" ),
158- api_key = os .getenv ("WATSONX_APIKEY" ),
159- temperature = 0 ,
160- max_tokens = 4000 ,
161- max_input_tokens = 100000 ,
162- )
163- llms ["watsonx_llm" ] = watsonx_llm
164- llms ["watsonx" ] = watsonx_llm
165- env_vars = ["WATSONX_APIKEY" , "WATSONX_URL" , "WATSONX_PROJECTID" , "MODEL_ID" ]
166- _llms_env_vars ["watsonx_llm" ] = env_vars
167- _llms_env_vars ["watsonx" ] = env_vars
168-
169162 # VLLM (AsyncOpenAI)
170163 if _check_env ("VLLM_URL" ):
171164 llms ["vllm_llm" ] = AsyncOpenAI (
@@ -255,6 +248,23 @@ def get_available_llms() -> dict[str, LLM | AsyncOpenAI]:
255248 _llms_env_vars ["litellm_proxy_llm" ] = env_vars
256249 _llms_env_vars ["litellm_proxy" ] = env_vars
257250
251+ # OpenAI LLM
252+ if _check_env ("OPENAI_API_KEY" ):
253+ openai_llm = LLM (
254+ model = os .getenv ("OPENAI_MODEL_ID" , "openai/gpt-4" ),
255+ base_url = os .getenv ("OPENAI_BASE_URL" ),
256+ temperature = 0.8 ,
257+ top_p = 0.9 ,
258+ stop = ["END" ],
259+ api_key = os .getenv ("OPENAI_API_KEY" ),
260+ seed = 42 ,
261+ )
262+ llms ["openai_llm" ] = openai_llm
263+ llms ["openai" ] = openai_llm
264+ env_vars = ["OPENAI_API_KEY" , "OPENAI_MODEL_ID" ]
265+ _llms_env_vars ["openai_llm" ] = env_vars
266+ _llms_env_vars ["openai" ] = env_vars
267+
258268 return llms
259269
260270
@@ -265,9 +275,11 @@ def __getattr__(name: str) -> dict[str, LLM | AsyncOpenAI] | LLM | AsyncOpenAI |
265275 Allows accessing 'available_llms' and individual LLM variables dynamically.
266276 """
267277 if name == "available_llms" :
268- return get_available_llms ()
278+ # return get_available_llms()
279+ return get_cached_available_llms ()
269280
270- llms = get_available_llms ()
281+ # llms = get_available_llms()
282+ llms = get_cached_available_llms ()
271283 if name in llms :
272284 return llms [name ]
273285
0 commit comments