
































@@ -639,46 +639,68 @@ export async function runEmbeddedAgent(
639639config: params.config,
640640workspaceDir: 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,
669650modelId,
670651agentDir,
671652params.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.
673657skipAgentDiscovery: true,
674658workspaceDir: 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;
682704const { model, error, authStorage, modelRegistry } = modelResolution;
683705if (!model) {
684706throw new FailoverError(error ?? `Unknown model: ${provider}/${modelId}`, {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。