@@ -63,12 +63,13 @@ impl MultiAgentWorkflowExecutor {
6363 }
6464
6565 /// Resolve LLM configuration from multiple sources with priority order:
66- ///
6766 /// 1. Request-level config (highest priority)
6867 /// 2. Role-level config from server config
6968 /// 3. Global defaults
7069 /// 4. Hardcoded fallback (lowest priority)
70+ ///
7171 /// Get a string value from Role.extra, checking both flat and nested paths.
72+ ///
7273 /// Due to `#[serde(flatten)]` on `Role.extra`, config JSON with `"extra": {"key": "val"}`
7374 /// results in `extra["extra"]["key"]` rather than `extra["key"]`.
7475 fn get_role_extra_str < ' a > (
@@ -93,6 +94,12 @@ impl MultiAgentWorkflowExecutor {
9394 } )
9495 }
9596
97+ /// Resolve LLM configuration from multiple sources with priority order:
98+ ///
99+ /// 1. Request-level config (highest priority)
100+ /// 2. Role-level config from server config
101+ /// 3. Global defaults
102+ /// 4. Hardcoded fallback (lowest priority)
96103 fn resolve_llm_config ( & self , request_config : Option < & LlmConfig > , role_name : & str ) -> LlmConfig {
97104 let mut resolved = LlmConfig :: default ( ) ;
98105
@@ -102,45 +109,31 @@ impl MultiAgentWorkflowExecutor {
102109 // Check if there's a global LLM config section
103110 let default_role_name = "Default" . into ( ) ;
104111 if let Some ( default_role) = config. roles . get ( & default_role_name) {
105- if let Some ( provider) = default_role. extra . get ( "llm_provider" ) {
106- if let Some ( provider_str) = provider. as_str ( ) {
107- resolved. llm_provider = Some ( provider_str. to_string ( ) ) ;
108- }
112+ if let Some ( s) = Self :: get_role_extra_str ( & default_role. extra , "llm_provider" ) {
113+ resolved. llm_provider = Some ( s. to_string ( ) ) ;
109114 }
110- if let Some ( model) = default_role. extra . get ( "llm_model" ) {
111- if let Some ( model_str) = model. as_str ( ) {
112- resolved. llm_model = Some ( model_str. to_string ( ) ) ;
113- }
115+ if let Some ( s) = Self :: get_role_extra_str ( & default_role. extra , "llm_model" ) {
116+ resolved. llm_model = Some ( s. to_string ( ) ) ;
114117 }
115- if let Some ( base_url) = default_role. extra . get ( "llm_base_url" ) {
116- if let Some ( base_url_str) = base_url. as_str ( ) {
117- resolved. llm_base_url = Some ( base_url_str. to_string ( ) ) ;
118- }
118+ if let Some ( s) = Self :: get_role_extra_str ( & default_role. extra , "llm_base_url" ) {
119+ resolved. llm_base_url = Some ( s. to_string ( ) ) ;
119120 }
120121 }
121122
122123 // Check role-specific config
123124 let role_name_key = role_name. into ( ) ;
124125 if let Some ( role) = config. roles . get ( & role_name_key) {
125- if let Some ( provider) = role. extra . get ( "llm_provider" ) {
126- if let Some ( provider_str) = provider. as_str ( ) {
127- resolved. llm_provider = Some ( provider_str. to_string ( ) ) ;
128- }
126+ if let Some ( s) = Self :: get_role_extra_str ( & role. extra , "llm_provider" ) {
127+ resolved. llm_provider = Some ( s. to_string ( ) ) ;
129128 }
130- if let Some ( model) = role. extra . get ( "llm_model" ) {
131- if let Some ( model_str) = model. as_str ( ) {
132- resolved. llm_model = Some ( model_str. to_string ( ) ) ;
133- }
129+ if let Some ( s) = Self :: get_role_extra_str ( & role. extra , "llm_model" ) {
130+ resolved. llm_model = Some ( s. to_string ( ) ) ;
134131 }
135- if let Some ( base_url) = role. extra . get ( "llm_base_url" ) {
136- if let Some ( base_url_str) = base_url. as_str ( ) {
137- resolved. llm_base_url = Some ( base_url_str. to_string ( ) ) ;
138- }
132+ if let Some ( s) = Self :: get_role_extra_str ( & role. extra , "llm_base_url" ) {
133+ resolved. llm_base_url = Some ( s. to_string ( ) ) ;
139134 }
140- if let Some ( temp) = role. extra . get ( "llm_temperature" ) {
141- if let Some ( temp_val) = temp. as_f64 ( ) {
142- resolved. llm_temperature = Some ( temp_val) ;
143- }
135+ if let Some ( v) = Self :: get_role_extra_f64 ( & role. extra , "llm_temperature" ) {
136+ resolved. llm_temperature = Some ( v) ;
144137 }
145138 }
146139 }
0 commit comments