@@ -31,11 +31,11 @@ use super::openai::OpenAIAdapter;
3131/// `providers` holds one health-check adapter per provider name (using `models.first()`).
3232pub struct ProviderRegistry {
3333 /// alias → pre-configured adapter for that exact model.
34- alias_map : HashMap < String , Arc < dyn LLMProvider > > ,
34+ alias_map : HashMap < String , ( String , Arc < dyn LLMProvider > ) > ,
3535 /// provider_name → adapter used for health checks (built from models.first()).
3636 providers : HashMap < String , Arc < dyn LLMProvider > > ,
3737 /// Fallback adapter resolved at construction time; used when primary exhausts retries.
38- fallback_provider : Option < Arc < dyn LLMProvider > > ,
38+ fallback_provider : Option < ( String , Arc < dyn LLMProvider > ) > ,
3939 max_retries : u32 ,
4040 retry_delay_ms : u64 ,
4141}
@@ -135,7 +135,7 @@ impl ProviderRegistry {
135135 }
136136
137137 // ── Phase 2: build one per-model adapter per winning alias ─────────────────────
138- let mut alias_map: HashMap < String , Arc < dyn LLMProvider > > = HashMap :: new ( ) ;
138+ let mut alias_map: HashMap < String , ( String , Arc < dyn LLMProvider > ) > = HashMap :: new ( ) ;
139139
140140 for provider_config in & config. spec . llm_providers {
141141 if !provider_config. enabled {
@@ -149,7 +149,7 @@ impl ProviderRegistry {
149149 {
150150 match Self :: create_adapter ( provider_config, winner_model) {
151151 Ok ( adapter) => {
152- alias_map. insert ( alias. clone ( ) , adapter) ;
152+ alias_map. insert ( alias. clone ( ) , ( winner_model . clone ( ) , adapter) ) ;
153153 }
154154 Err ( e) => {
155155 warn ! (
@@ -164,12 +164,18 @@ impl ProviderRegistry {
164164 }
165165
166166 // Resolve fallback to a concrete adapter at construction time.
167+ // We look up the provider name and assume the first model was used for health checks.
167168 let fallback_provider = config
168169 . spec
169170 . llm_selection
170171 . fallback_provider
171172 . as_deref ( )
172- . and_then ( |name| providers. get ( name) . cloned ( ) ) ;
173+ . and_then ( |name| {
174+ let adapter = providers. get ( name) ?. clone ( ) ;
175+ let provider_config = config. spec . llm_providers . iter ( ) . find ( |p| p. name == name) ?;
176+ let first_model = provider_config. models . first ( ) ?. model . clone ( ) ;
177+ Some ( ( first_model, adapter) )
178+ } ) ;
173179
174180 Ok ( Self {
175181 alias_map,
@@ -235,31 +241,34 @@ impl ProviderRegistry {
235241 tools : & [ ToolSchema ] ,
236242 options : & GenerationOptions ,
237243 ) -> Result < ChatResponse , LLMError > {
238- let provider = self
244+ let ( model_name , provider) = self
239245 . alias_map
240246 . get ( alias)
241247 . ok_or_else ( || LLMError :: ModelNotFound ( format ! ( "Model alias '{}' not found" , alias) ) ) ?;
242248
249+ info ! ( "LLM inference: alias='{}', model='{}'" , alias, model_name) ;
250+
243251 let mut last_error = None ;
244252
245253 for attempt in 0 ..self . max_retries {
246254 match provider. generate_chat ( messages, tools, options) . await {
247255 Ok ( response) => {
248- info ! ( "generate_chat successful on attempt {}" , attempt + 1 ) ;
256+ info ! ( "generate_chat successful: alias='{}', model='{}', attempt= {}" , alias , model_name , attempt + 1 ) ;
249257 return Ok ( response) ;
250258 }
251259 Err ( e) => {
252260 warn ! (
253- "generate_chat failed (attempt {}/{}): {:?}" ,
261+ "generate_chat failed: alias='{}', attempt={}/{}: {:?}" ,
262+ alias,
254263 attempt + 1 ,
255264 self . max_retries,
256265 e
257266 ) ;
258267 last_error = Some ( e) ;
259268
260269 if attempt == self . max_retries - 1 {
261- if let Some ( fallback) = & self . fallback_provider {
262- info ! ( "Trying fallback provider" ) ;
270+ if let Some ( ( fallback_model , fallback) ) = & self . fallback_provider {
271+ info ! ( "Trying fallback provider (model='{}')" , fallback_model ) ;
263272 return fallback. generate_chat ( messages, tools, options) . await ;
264273 }
265274 }
@@ -286,17 +295,19 @@ impl ProviderRegistry {
286295 prompt : & str ,
287296 options : & GenerationOptions ,
288297 ) -> Result < GenerationResponse , LLMError > {
289- let provider = self
298+ let ( model_name , provider) = self
290299 . alias_map
291300 . get ( alias)
292301 . ok_or_else ( || LLMError :: ModelNotFound ( format ! ( "Model alias '{}' not found" , alias) ) ) ?;
293302
303+ info ! ( "LLM text generation: alias='{}', model='{}'" , alias, model_name) ;
304+
294305 let mut last_error = None ;
295306
296307 for attempt in 0 ..self . max_retries {
297308 match provider. generate ( prompt, options) . await {
298309 Ok ( response) => {
299- info ! ( "Generation successful on attempt {}" , attempt + 1 ) ;
310+ info ! ( "Generation successful on attempt {} (model='{}') " , attempt + 1 , model_name ) ;
300311 return Ok ( response) ;
301312 }
302313 Err ( e) => {
@@ -309,8 +320,8 @@ impl ProviderRegistry {
309320 last_error = Some ( e) ;
310321
311322 if attempt == self . max_retries - 1 {
312- if let Some ( fallback) = & self . fallback_provider {
313- info ! ( "Trying fallback provider" ) ;
323+ if let Some ( ( fallback_model , fallback) ) = & self . fallback_provider {
324+ info ! ( "Trying fallback provider (model='{}')" , fallback_model ) ;
314325 return fallback. generate ( prompt, options) . await ;
315326 }
316327 }
@@ -434,7 +445,7 @@ impl LLMProvider for ProviderRegistry {
434445 }
435446
436447 async fn health_check ( & self ) -> Result < ( ) , LLMError > {
437- let provider = self
448+ let ( _ , provider) = self
438449 . alias_map
439450 . get ( "default" )
440451 . ok_or_else ( || LLMError :: Provider ( "Default model alias not configured" . into ( ) ) ) ?;
0 commit comments