






















@@ -1,6 +1,7 @@
11import { resolveAgentModelPrimaryValue } from "../config/model-input.js";
22import type { OpenClawConfig } from "../config/types.openclaw.js";
33import { createSubsystemLogger } from "../logging/subsystem.js";
4+import type { PluginManifestRecord } from "../plugins/manifest-registry.js";
45import {
56normalizeLowercaseStringOrEmpty,
67normalizeOptionalString,
@@ -35,6 +36,10 @@ export type ModelAliasIndex = {
3536byKey: Map<string, string[]>;
3637};
373839+type ManifestNormalizationContext = {
40+manifestPlugins?: readonly Pick<PluginManifestRecord, "modelIdNormalization">[];
41+};
42+3843function sanitizeModelWarningValue(value: string): string {
3944const stripped = value ? stripAnsi(value) : "";
4045let controlBoundary = -1;
@@ -179,12 +184,14 @@ function isConcreteOpenRouterFreeModelRef(ref: ModelRef): boolean {
179184return ref.provider === "openrouter" && ref.model.includes("/") && ref.model.endsWith(":free");
180185}
181186182-function resolveConfiguredOpenRouterCompatFreeRef(params: {
183-cfg: OpenClawConfig;
184-defaultProvider: string;
185-allowManifestNormalization?: boolean;
186-allowPluginNormalization?: boolean;
187-}): ModelRef | null {
187+function resolveConfiguredOpenRouterCompatFreeRef(
188+params: {
189+cfg: OpenClawConfig;
190+defaultProvider: string;
191+allowManifestNormalization?: boolean;
192+allowPluginNormalization?: boolean;
193+} & ManifestNormalizationContext,
194+): ModelRef | null {
188195const configuredModels = params.cfg.agents?.defaults?.models ?? {};
189196for (const raw of Object.keys(configuredModels)) {
190197if (!raw.includes("/")) {
@@ -193,6 +200,7 @@ function resolveConfiguredOpenRouterCompatFreeRef(params: {
193200const parsed = parseModelRef(raw, params.defaultProvider, {
194201allowManifestNormalization: params.allowManifestNormalization,
195202allowPluginNormalization: params.allowPluginNormalization,
203+manifestPlugins: params.manifestPlugins,
196204});
197205if (parsed && isConcreteOpenRouterFreeModelRef(parsed)) {
198206return parsed;
@@ -211,24 +219,28 @@ function resolveConfiguredOpenRouterCompatFreeRef(params: {
211219return normalizeModelRef("openrouter", modelId, {
212220allowManifestNormalization: params.allowManifestNormalization,
213221allowPluginNormalization: params.allowPluginNormalization,
222+manifestPlugins: params.manifestPlugins,
214223});
215224}
216225217226return null;
218227}
219228220-export function resolveConfiguredOpenRouterCompatAlias(params: {
221-cfg?: OpenClawConfig;
222-raw: string;
223-defaultProvider: string;
224-allowManifestNormalization?: boolean;
225-allowPluginNormalization?: boolean;
226-}): ModelRef | null {
229+export function resolveConfiguredOpenRouterCompatAlias(
230+params: {
231+cfg?: OpenClawConfig;
232+raw: string;
233+defaultProvider: string;
234+allowManifestNormalization?: boolean;
235+allowPluginNormalization?: boolean;
236+} & ManifestNormalizationContext,
237+): ModelRef | null {
227238const normalized = normalizeLowercaseStringOrEmpty(params.raw);
228239if (normalized === "openrouter:auto") {
229240return normalizeModelRef("openrouter", "auto", {
230241allowManifestNormalization: params.allowManifestNormalization,
231242allowPluginNormalization: params.allowPluginNormalization,
243+manifestPlugins: params.manifestPlugins,
232244});
233245}
234246if (normalized !== OPENROUTER_COMPAT_FREE_ALIAS || !params.cfg) {
@@ -239,32 +251,38 @@ export function resolveConfiguredOpenRouterCompatAlias(params: {
239251defaultProvider: params.defaultProvider,
240252allowManifestNormalization: params.allowManifestNormalization,
241253allowPluginNormalization: params.allowPluginNormalization,
254+manifestPlugins: params.manifestPlugins,
242255});
243256}
244257245-function parseModelRefWithCompatAlias(params: {
246-cfg?: OpenClawConfig;
247-raw: string;
248-defaultProvider: string;
249-allowManifestNormalization?: boolean;
250-allowPluginNormalization?: boolean;
251-}): ModelRef | null {
258+function parseModelRefWithCompatAlias(
259+params: {
260+cfg?: OpenClawConfig;
261+raw: string;
262+defaultProvider: string;
263+allowManifestNormalization?: boolean;
264+allowPluginNormalization?: boolean;
265+} & ManifestNormalizationContext,
266+): ModelRef | null {
252267return (
253268resolveConfiguredOpenRouterCompatAlias(params) ??
254269resolveExactConfiguredProviderRef(params) ??
255270parseModelRef(params.raw, params.defaultProvider, {
256271allowManifestNormalization: params.allowManifestNormalization,
257272allowPluginNormalization: params.allowPluginNormalization,
273+manifestPlugins: params.manifestPlugins,
258274})
259275);
260276}
261277262-function resolveExactConfiguredProviderRef(params: {
263-cfg?: OpenClawConfig;
264-raw: string;
265-allowManifestNormalization?: boolean;
266-allowPluginNormalization?: boolean;
267-}): ModelRef | null {
278+function resolveExactConfiguredProviderRef(
279+params: {
280+cfg?: OpenClawConfig;
281+raw: string;
282+allowManifestNormalization?: boolean;
283+allowPluginNormalization?: boolean;
284+} & ManifestNormalizationContext,
285+): ModelRef | null {
268286const slash = params.raw.indexOf("/");
269287if (slash <= 0 || !params.cfg?.models?.providers) {
270288return null;
@@ -293,6 +311,7 @@ function resolveExactConfiguredProviderRef(params: {
293311 provider,
294312model: normalizeStaticProviderModelId(provider, modelRaw.trim(), {
295313allowManifestNormalization: params.allowManifestNormalization,
314+manifestPlugins: params.manifestPlugins,
296315}),
297316};
298317}
@@ -336,12 +355,14 @@ export function buildConfiguredAllowlistKeys(params: {
336355return keys.size > 0 ? keys : null;
337356}
338357339-export function buildModelAliasIndex(params: {
340-cfg: OpenClawConfig;
341-defaultProvider: string;
342-allowManifestNormalization?: boolean;
343-allowPluginNormalization?: boolean;
344-}): ModelAliasIndex {
358+export function buildModelAliasIndex(
359+params: {
360+cfg: OpenClawConfig;
361+defaultProvider: string;
362+allowManifestNormalization?: boolean;
363+allowPluginNormalization?: boolean;
364+} & ManifestNormalizationContext,
365+): ModelAliasIndex {
345366const byAlias = new Map<string, { alias: string; ref: ModelRef }>();
346367const byKey = new Map<string, string[]>();
347368@@ -353,6 +374,7 @@ export function buildModelAliasIndex(params: {
353374defaultProvider: params.defaultProvider,
354375allowManifestNormalization: params.allowManifestNormalization,
355376allowPluginNormalization: params.allowPluginNormalization,
377+manifestPlugins: params.manifestPlugins,
356378});
357379if (!parsed) {
358380continue;
@@ -459,14 +481,16 @@ function buildSyntheticAllowedCatalogEntry(params: {
459481};
460482}
461483462-export function resolveModelRefFromString(params: {
463-cfg?: OpenClawConfig;
464-raw: string;
465-defaultProvider: string;
466-aliasIndex?: ModelAliasIndex;
467-allowManifestNormalization?: boolean;
468-allowPluginNormalization?: boolean;
469-}): { ref: ModelRef; alias?: string } | null {
484+export function resolveModelRefFromString(
485+params: {
486+cfg?: OpenClawConfig;
487+raw: string;
488+defaultProvider: string;
489+aliasIndex?: ModelAliasIndex;
490+allowManifestNormalization?: boolean;
491+allowPluginNormalization?: boolean;
492+} & ManifestNormalizationContext,
493+): { ref: ModelRef; alias?: string } | null {
470494const { model } = splitTrailingAuthProfile(params.raw);
471495if (!model) {
472496return null;
@@ -482,6 +506,7 @@ export function resolveModelRefFromString(params: {
482506defaultProvider: params.defaultProvider,
483507allowManifestNormalization: params.allowManifestNormalization,
484508allowPluginNormalization: params.allowPluginNormalization,
509+manifestPlugins: params.manifestPlugins,
485510});
486511if (!parsed) {
487512return null;
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。