@@ -204,6 +204,49 @@ export function inferUniqueProviderFromConfiguredModels(params: {
204204 return providers . values ( ) . next ( ) . value ;
205205}
206206
207+ function inferProviderFromModelHint ( params : {
208+ cfg : OpenClawConfig ;
209+ model : string ;
210+ } ) : string | undefined {
211+ const inferredProvider = inferUniqueProviderFromConfiguredModels ( {
212+ cfg : params . cfg ,
213+ model : params . model ,
214+ } ) ;
215+ if ( inferredProvider ) {
216+ return inferredProvider ;
217+ }
218+ const lower = params . model . toLowerCase ( ) ;
219+ if ( lower === "gemini" || lower . startsWith ( "gemini-" ) ) {
220+ return "google" ;
221+ }
222+ return undefined ;
223+ }
224+
225+ function normalizeSubagentSpawnModelSelection ( params : {
226+ cfg : OpenClawConfig ;
227+ model : string ;
228+ defaultProvider : string ;
229+ } ) : string {
230+ const trimmed = params . model . trim ( ) ;
231+ if ( ! trimmed ) {
232+ return trimmed ;
233+ }
234+ if ( trimmed . includes ( "/" ) ) {
235+ const parsed = parseModelRef ( trimmed , params . defaultProvider ) ;
236+ if ( ! parsed ) {
237+ return trimmed ;
238+ }
239+ return `${ parsed . provider } /${ parsed . model } ` ;
240+ }
241+ const inferredProvider = inferProviderFromModelHint ( {
242+ cfg : params . cfg ,
243+ model : trimmed ,
244+ } ) ;
245+ const selectedProvider = normalizeProviderId ( inferredProvider ?? params . defaultProvider ) ;
246+ const selectedModel = normalizeProviderModelId ( selectedProvider , trimmed ) ;
247+ return `${ selectedProvider } /${ selectedModel } ` ;
248+ }
249+
207250export function resolveAllowlistModelKey ( raw : string , defaultProvider : string ) : string | null {
208251 const parsed = parseModelRef ( raw , defaultProvider ) ;
209252 if ( ! parsed ) {
@@ -371,13 +414,38 @@ export function resolveSubagentSpawnModelSelection(params: {
371414 cfg : params . cfg ,
372415 agentId : params . agentId ,
373416 } ) ;
417+ const resolvedModelOverride = params . modelOverride
418+ ? normalizeSubagentSpawnModelSelection ( {
419+ cfg : params . cfg ,
420+ model : normalizeModelSelection ( params . modelOverride ) ?? "" ,
421+ defaultProvider : runtimeDefault . provider ,
422+ } )
423+ : undefined ;
424+ const resolvedConfiguredModel = resolveSubagentConfiguredModelSelection ( {
425+ cfg : params . cfg ,
426+ agentId : params . agentId ,
427+ } ) ;
428+ const normalizedConfiguredModel = resolvedConfiguredModel
429+ ? normalizeSubagentSpawnModelSelection ( {
430+ cfg : params . cfg ,
431+ model : resolvedConfiguredModel ,
432+ defaultProvider : runtimeDefault . provider ,
433+ } )
434+ : undefined ;
435+ const normalizedPrimaryModel = resolveAgentModelPrimaryValue ( params . cfg . agents ?. defaults ?. model )
436+ ? normalizeSubagentSpawnModelSelection ( {
437+ cfg : params . cfg ,
438+ model :
439+ normalizeModelSelection (
440+ resolveAgentModelPrimaryValue ( params . cfg . agents ?. defaults ?. model ) ,
441+ ) ?? "" ,
442+ defaultProvider : runtimeDefault . provider ,
443+ } )
444+ : undefined ;
374445 return (
375- normalizeModelSelection ( params . modelOverride ) ??
376- resolveSubagentConfiguredModelSelection ( {
377- cfg : params . cfg ,
378- agentId : params . agentId ,
379- } ) ??
380- normalizeModelSelection ( resolveAgentModelPrimaryValue ( params . cfg . agents ?. defaults ?. model ) ) ??
446+ resolvedModelOverride ??
447+ normalizedConfiguredModel ??
448+ normalizedPrimaryModel ??
381449 `${ runtimeDefault . provider } /${ runtimeDefault . model } `
382450 ) ;
383451}
0 commit comments