2323 load_external_api_keys ,
2424)
2525from invokeai .app .services .external_generation .external_generation_common import ExternalProviderStatus
26+ from invokeai .app .services .external_generation .startup import sync_configured_external_starter_models
2627from invokeai .app .services .invocation_cache .invocation_cache_common import InvocationCacheStatus
2728from invokeai .app .services .model_records .model_records_base import UnknownModelException
2829from invokeai .backend .image_util .infill_methods .patchmatch import PatchMatch
@@ -178,7 +179,7 @@ async def update_runtime_config(
178179 status_code = 200 ,
179180 response_model = list [ExternalProviderStatusModel ],
180181)
181- async def get_external_provider_statuses () -> list [ExternalProviderStatusModel ]:
182+ async def get_external_provider_statuses (_ : AdminUserOrDefault ) -> list [ExternalProviderStatusModel ]:
182183 statuses = ApiDependencies .invoker .services .external_generation .get_provider_statuses ()
183184 return [status_to_model (status ) for status in statuses .values ()]
184185
@@ -189,7 +190,7 @@ async def get_external_provider_statuses() -> list[ExternalProviderStatusModel]:
189190 status_code = 200 ,
190191 response_model = list [ExternalProviderConfigModel ],
191192)
192- async def get_external_provider_configs () -> list [ExternalProviderConfigModel ]:
193+ async def get_external_provider_configs (_ : AdminUserOrDefault ) -> list [ExternalProviderConfigModel ]:
193194 config = get_config ()
194195 return [_build_external_provider_config (provider_id , config ) for provider_id in EXTERNAL_PROVIDER_FIELDS ]
195196
@@ -219,9 +220,14 @@ async def set_external_provider_config(
219220 raise HTTPException (status_code = 400 , detail = "No external provider config fields provided" )
220221
221222 api_key_removed = update .api_key is not None and updates .get (api_key_field ) is None
223+ api_key_set = update .api_key is not None and updates .get (api_key_field ) is not None
222224 _apply_external_provider_update (updates )
223225 if api_key_removed :
224226 _remove_external_models_for_provider (provider_id )
227+ elif api_key_set :
228+ # Configuring a key should make the provider's models usable without a
229+ # restart; queue its external starter models the same way startup does.
230+ _sync_external_starter_models_for_provider (provider_id )
225231 return _build_external_provider_config (provider_id , get_config ())
226232
227233
@@ -316,6 +322,19 @@ def _build_external_provider_config(provider_id: str, config: InvokeAIAppConfig)
316322 )
317323
318324
325+ def _sync_external_starter_models_for_provider (provider_id : str ) -> None :
326+ invoker = ApiDependencies .invoker
327+ try :
328+ sync_configured_external_starter_models (
329+ configured_provider_ids = {provider_id },
330+ model_manager = invoker .services .model_manager ,
331+ logger = invoker .services .logger ,
332+ )
333+ except Exception as error :
334+ # Queuing installs must never fail the config save; surface and move on.
335+ invoker .services .logger .warning (f"Failed queueing external starter models for '{ provider_id } ': { error } " )
336+
337+
319338def _remove_external_models_for_provider (provider_id : str ) -> None :
320339 model_manager = ApiDependencies .invoker .services .model_manager
321340 external_models = model_manager .store .search_by_attr (
0 commit comments