



























@@ -6,6 +6,7 @@ import type { OpenClawConfig } from "../config/types.openclaw.js";
66import { emitFailoverEvent } from "../infra/diagnostic-events.js";
77import { formatErrorMessage } from "../infra/errors.js";
88import { createSubsystemLogger } from "../logging/subsystem.js";
9+import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
910import { isCommandLaneTaskTimeoutError } from "../process/command-queue.js";
1011import { createLazyImportLoader } from "../shared/lazy-promise.js";
1112import { normalizeOptionalString } from "../shared/string-coerce.js";
@@ -93,6 +94,10 @@ type ModelFallbackRunFn<T> = (
9394options?: ModelFallbackRunOptions,
9495) => Promise<T>;
959697+type ManifestNormalizationContext = {
98+manifestPlugins?: readonly Pick<PluginManifestRecord, "modelIdNormalization">[];
99+};
100+96101/**
97102 * Fallback abort check. Only treats explicit AbortError names as user aborts.
98103 * Message-based checks (e.g., "aborted") can mask timeouts and skip fallback.
@@ -475,18 +480,22 @@ function resolveFallbackSoonestCooldownExpiry(params: {
475480return soonest;
476481}
477482478-function resolveImageFallbackCandidates(params: {
479-cfg: OpenClawConfig | undefined;
480-defaultProvider: string;
481-modelOverride?: string;
482-}): ModelCandidate[] {
483+function resolveImageFallbackCandidates(
484+params: {
485+cfg: OpenClawConfig | undefined;
486+defaultProvider: string;
487+modelOverride?: string;
488+} & ManifestNormalizationContext,
489+): ModelCandidate[] {
483490const aliasIndex = buildModelAliasIndex({
484491cfg: params.cfg ?? {},
485492defaultProvider: params.defaultProvider,
493+manifestPlugins: params.manifestPlugins,
486494});
487495const allowlist = buildConfiguredAllowlistKeys({
488496cfg: params.cfg,
489497defaultProvider: params.defaultProvider,
498+manifestPlugins: params.manifestPlugins,
490499});
491500const { candidates, addExplicitCandidate, addAllowlistedCandidate } =
492501createModelCandidateCollector(allowlist);
@@ -496,6 +505,7 @@ function resolveImageFallbackCandidates(params: {
496505 raw,
497506defaultProvider: params.defaultProvider,
498507 aliasIndex,
508+manifestPlugins: params.manifestPlugins,
499509});
500510if (!resolved) {
501511return;
@@ -553,43 +563,52 @@ export const __testing = {
553563 resolveSessionSuspensionReason,
554564} as const;
555565556-function resolveFallbackCandidates(params: {
557-cfg: OpenClawConfig | undefined;
558-provider: string;
559-model: string;
560-/** Optional explicit fallbacks list; when provided (even empty), replaces agents.defaults.model.fallbacks. */
561-fallbacksOverride?: string[];
562-}): ModelCandidate[] {
566+function resolveFallbackCandidates(
567+params: {
568+cfg: OpenClawConfig | undefined;
569+provider: string;
570+model: string;
571+/** Optional explicit fallbacks list; when provided (even empty), replaces agents.defaults.model.fallbacks. */
572+fallbacksOverride?: string[];
573+} & ManifestNormalizationContext,
574+): ModelCandidate[] {
563575const primary = params.cfg
564576 ? resolveConfiguredModelRef({
565577cfg: params.cfg,
566578defaultProvider: DEFAULT_PROVIDER,
567579defaultModel: DEFAULT_MODEL,
580+manifestPlugins: params.manifestPlugins,
568581})
569582 : null;
570583const defaultProvider = primary?.provider ?? DEFAULT_PROVIDER;
571584const defaultModel = primary?.model ?? DEFAULT_MODEL;
572585const providerRaw = normalizeOptionalString(params.provider) || defaultProvider;
573586const modelRaw = normalizeOptionalString(params.model) || defaultModel;
574-const normalizedPrimary = normalizeModelRef(providerRaw, modelRaw);
587+const normalizedPrimary = normalizeModelRef(providerRaw, modelRaw, {
588+manifestPlugins: params.manifestPlugins,
589+});
575590const aliasIndex = buildModelAliasIndex({
576591cfg: params.cfg ?? {},
577592 defaultProvider,
593+manifestPlugins: params.manifestPlugins,
578594});
579595const allowlist = buildConfiguredAllowlistKeys({
580596cfg: params.cfg,
581597 defaultProvider,
598+manifestPlugins: params.manifestPlugins,
582599});
583600const { candidates, addExplicitCandidate } = createModelCandidateCollector(allowlist);
584601const resolvedModelAlias = resolveModelRefFromString({
585602raw: modelRaw,
586603defaultProvider: providerRaw,
587604 aliasIndex,
605+manifestPlugins: params.manifestPlugins,
588606});
589607const resolvedProviderModelAlias = resolveModelRefFromString({
590608raw: `${providerRaw}/${modelRaw}`,
591609 defaultProvider,
592610 aliasIndex,
611+manifestPlugins: params.manifestPlugins,
593612});
594613const resolvedBareModelAlias =
595614resolvedModelAlias?.alias &&
@@ -601,7 +620,9 @@ function resolveFallbackCandidates(params: {
601620(resolvedProviderModelAlias?.alias ? resolvedProviderModelAlias.ref : null) ??
602621resolvedBareModelAlias ??
603622normalizedPrimary;
604-const effectivePrimary = normalizeModelRef(resolvedPrimary.provider, resolvedPrimary.model);
623+const effectivePrimary = normalizeModelRef(resolvedPrimary.provider, resolvedPrimary.model, {
624+manifestPlugins: params.manifestPlugins,
625+});
605626606627addExplicitCandidate(effectivePrimary);
607628@@ -615,6 +636,7 @@ function resolveFallbackCandidates(params: {
615636 raw,
616637 defaultProvider,
617638 aliasIndex,
639+manifestPlugins: params.manifestPlugins,
618640});
619641if (!resolved) {
620642continue;
@@ -814,26 +836,29 @@ function resolveCooldownDecision(params: {
814836};
815837}
816838817-export async function runWithModelFallback<T>(params: {
818-cfg: OpenClawConfig | undefined;
819-provider: string;
820-model: string;
821-runId?: string;
822-sessionId?: string;
823-lane?: string;
824-agentDir?: string;
825-/** Optional explicit fallbacks list; when provided (even empty), replaces agents.defaults.model.fallbacks. */
826-fallbacksOverride?: string[];
827-run: ModelFallbackRunFn<T>;
828-onError?: ModelFallbackErrorHandler;
829-onFallbackStep?: ModelFallbackStepHandler;
830-classifyResult?: ModelFallbackResultClassifier<T>;
831-}): Promise<ModelFallbackRunResult<T>> {
839+export async function runWithModelFallback<T>(
840+params: {
841+cfg: OpenClawConfig | undefined;
842+provider: string;
843+model: string;
844+runId?: string;
845+sessionId?: string;
846+lane?: string;
847+agentDir?: string;
848+/** Optional explicit fallbacks list; when provided (even empty), replaces agents.defaults.model.fallbacks. */
849+fallbacksOverride?: string[];
850+run: ModelFallbackRunFn<T>;
851+onError?: ModelFallbackErrorHandler;
852+onFallbackStep?: ModelFallbackStepHandler;
853+classifyResult?: ModelFallbackResultClassifier<T>;
854+} & ManifestNormalizationContext,
855+): Promise<ModelFallbackRunResult<T>> {
832856const candidates = resolveFallbackCandidates({
833857cfg: params.cfg,
834858provider: params.provider,
835859model: params.model,
836860fallbacksOverride: params.fallbacksOverride,
861+manifestPlugins: params.manifestPlugins,
837862});
838863const authRuntime =
839864params.cfg && hasAnyAuthProfileStoreSource(params.agentDir)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。