





















@@ -12,14 +12,18 @@ import type { ModelDefinitionConfig } from "../config/types.models.js";
1212import type { OpenClawConfig } from "../config/types.openclaw.js";
1313import { createSubsystemLogger } from "../logging/subsystem.js";
1414import { planManifestModelCatalogRows, type ModelCatalogCost } from "../model-catalog/index.js";
15+import { isInstalledPluginEnabled } from "../plugins/installed-plugin-index.js";
16+import { loadPluginManifestRegistryForInstalledIndex } from "../plugins/manifest-registry-installed.js";
17+import type { PluginManifestRegistry } from "../plugins/manifest-registry.js";
1518import type {
1619PluginManifestModelPricingModelIdTransform,
1720PluginManifestModelPricingProvider,
1821PluginManifestModelPricingSource,
1922} from "../plugins/manifest.js";
23+import type { PluginLookUpTable } from "../plugins/plugin-lookup-table.js";
2024import {
21-loadPluginManifestRegistryForPluginRegistry,
22-resolveManifestContractPluginIds,
25+loadPluginRegistrySnapshot,
26+type PluginRegistrySnapshot,
2327} from "../plugins/plugin-registry.js";
2428import { normalizeProviderModelIdWithPlugin } from "../plugins/provider-runtime.js";
2529import { normalizeOptionalString, resolvePrimaryStringValue } from "../shared/string-coerce.js";
@@ -39,6 +43,11 @@ type OpenRouterPricingEntry = {
39434044type ModelListLike = string | { primary?: string; fallbacks?: string[] } | undefined;
414546+type ModelPricingManifestMetadata = {
47+allRegistry: PluginManifestRegistry;
48+activeRegistry: PluginManifestRegistry;
49+};
50+4251type OpenRouterModelPayload = {
4352id?: unknown;
4453pricing?: unknown;
@@ -361,11 +370,60 @@ function normalizeExternalPricingPolicy(
361370};
362371}
363372364-function loadManifestPricingContext(config: OpenClawConfig): {
373+function filterActiveManifestRegistry(params: {
374+registry: PluginManifestRegistry;
375+index: PluginRegistrySnapshot;
376+config: OpenClawConfig;
377+}): PluginManifestRegistry {
378+return {
379+diagnostics: params.registry.diagnostics,
380+plugins: params.registry.plugins.filter((plugin) =>
381+isInstalledPluginEnabled(params.index, plugin.id, params.config),
382+),
383+};
384+}
385+386+function resolveModelPricingManifestMetadata(params: {
387+config: OpenClawConfig;
388+pluginLookUpTable?: Pick<PluginLookUpTable, "index" | "manifestRegistry">;
389+manifestRegistry?: PluginManifestRegistry;
390+}): ModelPricingManifestMetadata {
391+if (params.pluginLookUpTable) {
392+return {
393+allRegistry: params.pluginLookUpTable.manifestRegistry,
394+activeRegistry: filterActiveManifestRegistry({
395+registry: params.pluginLookUpTable.manifestRegistry,
396+index: params.pluginLookUpTable.index,
397+config: params.config,
398+}),
399+};
400+}
401+if (params.manifestRegistry) {
402+return {
403+allRegistry: params.manifestRegistry,
404+activeRegistry: params.manifestRegistry,
405+};
406+}
407+const index = loadPluginRegistrySnapshot({ config: params.config });
408+const allRegistry = loadPluginManifestRegistryForInstalledIndex({
409+ index,
410+config: params.config,
411+includeDisabled: true,
412+});
413+return {
414+ allRegistry,
415+activeRegistry: filterActiveManifestRegistry({
416+registry: allRegistry,
417+ index,
418+config: params.config,
419+}),
420+};
421+}
422+423+function loadManifestPricingContext(registry: PluginManifestRegistry): {
365424policies: Map<string, ExternalPricingPolicy>;
366425catalogPricing: Map<string, CachedModelPricing>;
367426} {
368-const registry = loadPluginManifestRegistryForPluginRegistry({ config });
369427const policies = new Map<string, ExternalPricingPolicy>();
370428for (const plugin of registry.plugins) {
371429for (const [provider, rawPolicy] of Object.entries(plugin.modelPricing?.providers ?? {})) {
@@ -549,11 +607,12 @@ function addConfiguredWebSearchPluginModels(params: {
549607config: OpenClawConfig;
550608aliasIndex: ReturnType<typeof buildModelAliasIndex>;
551609refs: Map<string, ModelRef>;
610+manifestRegistry: PluginManifestRegistry;
552611}): void {
553-for (const pluginId of resolveManifestContractPluginIds({
554-contract: "webSearchProviders",
555-config: params.config,
556-})) {
612+for (const pluginId of params.manifestRegistry.plugins
613+.filter((plugin) => (plugin.contracts?.webSearchProviders ?? []).length > 0)
614+.map((plugin) => plugin.id)
615+ .toSorted((left, right) => left.localeCompare(right))) {
557616addResolvedModelRef({
558617raw: resolvePluginWebSearchConfig(params.config, pluginId)?.model as string | undefined,
559618aliasIndex: params.aliasIndex,
@@ -659,7 +718,12 @@ function filterExternalPricingRefs(params: {
659718);
660719}
661720662-export function collectConfiguredModelPricingRefs(config: OpenClawConfig): ModelRef[] {
721+export function collectConfiguredModelPricingRefs(
722+config: OpenClawConfig,
723+options: { manifestRegistry?: PluginManifestRegistry } = {},
724+): ModelRef[] {
725+const manifestRegistry =
726+options.manifestRegistry ?? resolveModelPricingManifestMetadata({ config }).allRegistry;
663727const refs = new Map<string, ModelRef>();
664728const aliasIndex = buildModelAliasIndex({
665729cfg: config,
@@ -698,7 +762,7 @@ export function collectConfiguredModelPricingRefs(config: OpenClawConfig): Model
698762}
699763}
700764701-addConfiguredWebSearchPluginModels({ config, aliasIndex, refs });
765+addConfiguredWebSearchPluginModels({ config, aliasIndex, refs, manifestRegistry });
702766703767for (const entry of config.tools?.media?.models ?? []) {
704768addProviderModelPair({ provider: entry.provider, model: entry.model, refs });
@@ -823,14 +887,23 @@ function collectSeededPricing(params: {
823887export async function refreshGatewayModelPricingCache(params: {
824888config: OpenClawConfig;
825889fetchImpl?: typeof fetch;
890+pluginLookUpTable?: Pick<PluginLookUpTable, "index" | "manifestRegistry">;
891+manifestRegistry?: PluginManifestRegistry;
826892}): Promise<void> {
827893if (inFlightRefresh) {
828894return await inFlightRefresh;
829895}
830896const fetchImpl = params.fetchImpl ?? fetch;
831897inFlightRefresh = (async () => {
832-const pricingContext = loadManifestPricingContext(params.config);
833-const allRefs = collectConfiguredModelPricingRefs(params.config);
898+const manifestMetadata = resolveModelPricingManifestMetadata({
899+config: params.config,
900+pluginLookUpTable: params.pluginLookUpTable,
901+manifestRegistry: params.manifestRegistry,
902+});
903+const pricingContext = loadManifestPricingContext(manifestMetadata.activeRegistry);
904+const allRefs = collectConfiguredModelPricingRefs(params.config, {
905+manifestRegistry: manifestMetadata.allRegistry,
906+});
834907const seededPricing = collectSeededPricing({
835908config: params.config,
836909refs: allRefs,
@@ -950,6 +1023,8 @@ export async function refreshGatewayModelPricingCache(params: {
9501023export function startGatewayModelPricingRefresh(params: {
9511024config: OpenClawConfig;
9521025fetchImpl?: typeof fetch;
1026+pluginLookUpTable?: Pick<PluginLookUpTable, "index" | "manifestRegistry">;
1027+manifestRegistry?: PluginManifestRegistry;
9531028}): () => void {
9541029let stopped = false;
9551030queueMicrotask(() => {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。