@@ -639,46 +639,68 @@ export async function runEmbeddedAgent(
639639 config : params . config ,
640640 workspaceDir : resolvedWorkspace ,
641641 } ) ;
642- const dynamicModelResolution = await resolveModelAsync (
643- provider ,
644- modelId ,
645- agentDir ,
646- params . config ,
647- {
648- // Plugin dynamic model hooks can resolve explicit model refs without
649- // first generating OpenClaw models.json. This keeps one-shot model runs from
650- // blocking on unrelated provider discovery.
651- skipAgentDiscovery : true ,
652- workspaceDir : resolvedWorkspace ,
653- } ,
654- ) ;
655- let modelResolution =
656- dynamicModelResolution . model || pluginHarnessOwnsTransport
657- ? dynamicModelResolution
658- : await ( async ( ) => {
659- await ensureOpenClawModelsJson ( params . config , agentDir , {
660- workspaceDir : resolvedWorkspace ,
661- } ) ;
662- return await resolveModelAsync ( provider , modelId , agentDir , params . config , {
663- workspaceDir : resolvedWorkspace ,
664- } ) ;
665- } ) ( ) ;
666- if ( selectedRuntimeProvider !== provider && modelResolution . model ) {
667- const runtimeModelResolution = await resolveModelAsync (
668- selectedRuntimeProvider ,
642+ const modelResolutionProviders =
643+ selectedRuntimeProvider !== provider ? [ selectedRuntimeProvider , provider ] : [ provider ] ;
644+ let resolvedModelProvider = provider ;
645+ let firstModelResolution : Awaited < ReturnType < typeof resolveModelAsync > > | undefined ;
646+ let modelResolution : Awaited < ReturnType < typeof resolveModelAsync > > | undefined ;
647+ for ( const candidateProvider of modelResolutionProviders ) {
648+ const candidateResolution = await resolveModelAsync (
649+ candidateProvider ,
669650 modelId ,
670651 agentDir ,
671652 params . config ,
672653 {
654+ // Plugin dynamic model hooks can resolve explicit model refs without
655+ // first generating OpenClaw models.json. This keeps one-shot model runs from
656+ // blocking on unrelated provider discovery.
673657 skipAgentDiscovery : true ,
674658 workspaceDir : resolvedWorkspace ,
675659 } ,
676660 ) ;
677- if ( runtimeModelResolution . model ) {
678- provider = selectedRuntimeProvider ;
679- modelResolution = runtimeModelResolution ;
661+ firstModelResolution ??= candidateResolution ;
662+ if ( candidateResolution . model ) {
663+ resolvedModelProvider = candidateProvider ;
664+ modelResolution = candidateResolution ;
665+ break ;
666+ }
667+ }
668+ if ( ! modelResolution && pluginHarnessOwnsTransport ) {
669+ modelResolution = firstModelResolution ;
670+ }
671+ if ( ! modelResolution ) {
672+ await ensureOpenClawModelsJson ( params . config , agentDir , {
673+ workspaceDir : resolvedWorkspace ,
674+ } ) ;
675+ for ( const candidateProvider of modelResolutionProviders ) {
676+ const candidateResolution = await resolveModelAsync (
677+ candidateProvider ,
678+ modelId ,
679+ agentDir ,
680+ params . config ,
681+ {
682+ workspaceDir : resolvedWorkspace ,
683+ } ,
684+ ) ;
685+ firstModelResolution ??= candidateResolution ;
686+ if ( candidateResolution . model ) {
687+ resolvedModelProvider = candidateProvider ;
688+ modelResolution = candidateResolution ;
689+ break ;
690+ }
680691 }
681692 }
693+ modelResolution ??= firstModelResolution ;
694+ if ( ! modelResolution ) {
695+ throw new FailoverError ( `Unknown model: ${ provider } /${ modelId } ` , {
696+ reason : "model_not_found" ,
697+ provider,
698+ model : modelId ,
699+ sessionId : params . sessionId ,
700+ lane : globalLane ,
701+ } ) ;
702+ }
703+ provider = resolvedModelProvider ;
682704 const { model, error, authStorage, modelRegistry } = modelResolution ;
683705 if ( ! model ) {
684706 throw new FailoverError ( error ?? `Unknown model: ${ provider } /${ modelId } ` , {
0 commit comments