























@@ -10,6 +10,7 @@ import {
1010loadManifestMetadataSnapshot,
1111} from "../plugins/manifest-contract-eligibility.js";
1212import { loadPluginMetadataSnapshot } from "../plugins/plugin-metadata-snapshot.js";
13+import type { PluginMetadataSnapshot } from "../plugins/plugin-metadata-snapshot.types.js";
1314import { augmentModelCatalogWithProviderPlugins } from "../plugins/provider-runtime.runtime.js";
1415import { createLazyImportLoader } from "../shared/lazy-promise.js";
1516import {
@@ -131,13 +132,16 @@ export function loadManifestModelCatalog(params: {
131132workspaceDir?: string;
132133env?: NodeJS.ProcessEnv;
133134fallbackToMetadataScan?: boolean;
135+metadataSnapshot?: PluginMetadataSnapshot;
134136}): ModelCatalogEntry[] {
135-const snapshot = getCurrentPluginMetadataSnapshot({
136-config: params.config,
137-env: params.env,
138- ...(params.workspaceDir !== undefined ? { workspaceDir: params.workspaceDir } : {}),
139- ...(params.workspaceDir === undefined ? { allowWorkspaceScopedSnapshot: true } : {}),
140-});
137+const snapshot =
138+params.metadataSnapshot ??
139+getCurrentPluginMetadataSnapshot({
140+config: params.config,
141+env: params.env,
142+ ...(params.workspaceDir !== undefined ? { workspaceDir: params.workspaceDir } : {}),
143+ ...(params.workspaceDir === undefined ? { allowWorkspaceScopedSnapshot: true } : {}),
144+});
141145const resolvedSnapshot =
142146snapshot ??
143147(params.fallbackToMetadataScan === false
@@ -256,6 +260,7 @@ function normalizePersistedModelCatalogEntry(
256260257261async function loadReadOnlyPersistedModelCatalog(params?: {
258262config?: OpenClawConfig;
263+metadataSnapshot?: PluginMetadataSnapshot;
259264}): Promise<ModelCatalogEntry[]> {
260265const cfg = params?.config ?? getRuntimeConfig();
261266const agentDir = resolveDefaultAgentDir(cfg);
@@ -266,10 +271,12 @@ async function loadReadOnlyPersistedModelCatalog(params?: {
266271const shouldSuppressBuiltInModel = buildShouldSuppressBuiltInModel({ config: cfg });
267272let manifestPlugins: ProviderModelIdNormalizationOptions["manifestPlugins"];
268273const getManifestPlugins = () => {
269-manifestPlugins ??= loadManifestMetadataSnapshot({
270-config: cfg,
271-env: process.env,
272-}).plugins;
274+manifestPlugins ??=
275+params?.metadataSnapshot?.plugins ??
276+loadManifestMetadataSnapshot({
277+config: cfg,
278+env: process.env,
279+}).plugins;
273280return manifestPlugins;
274281};
275282const providers =
@@ -327,7 +334,10 @@ function hasConfiguredProviderRowsNeedingManifestLookup(cfg: OpenClawConfig): bo
327334);
328335}
329336330-function loadReadOnlyStaticModelCatalog(params?: { config?: OpenClawConfig }): ModelCatalogEntry[] {
337+function loadReadOnlyStaticModelCatalog(params?: {
338+config?: OpenClawConfig;
339+metadataSnapshot?: PluginMetadataSnapshot;
340+}): ModelCatalogEntry[] {
331341const cfg = params?.config ?? getRuntimeConfig();
332342const models: ModelCatalogEntry[] = [];
333343try {
@@ -337,6 +347,7 @@ function loadReadOnlyStaticModelCatalog(params?: { config?: OpenClawConfig }): M
337347config: cfg,
338348env: process.env,
339349fallbackToMetadataScan: false,
350+metadataSnapshot: params?.metadataSnapshot,
340351}),
341352);
342353} catch (error) {
@@ -347,10 +358,11 @@ function loadReadOnlyStaticModelCatalog(params?: { config?: OpenClawConfig }): M
347358}
348359349360const configuredManifestPlugins = hasConfiguredProviderRowsNeedingManifestLookup(cfg)
350- ? loadPluginMetadataSnapshot({
361+ ? (params?.metadataSnapshot?.plugins ??
362+loadPluginMetadataSnapshot({
351363config: cfg,
352364env: process.env,
353-}).plugins
365+}).plugins)
354366 : [];
355367const configuredModels = buildConfiguredModelCatalog({
356368 cfg,
@@ -366,6 +378,7 @@ export async function loadModelCatalog(params?: {
366378config?: OpenClawConfig;
367379useCache?: boolean;
368380readOnly?: boolean;
381+metadataSnapshot?: PluginMetadataSnapshot;
369382}): Promise<ModelCatalogEntry[]> {
370383const readOnly = params?.readOnly === true;
371384if (readOnly) {
@@ -380,7 +393,8 @@ export async function loadModelCatalog(params?: {
380393if (!readOnly && params?.useCache === false) {
381394modelCatalogPromise = null;
382395}
383-if (!readOnly && modelCatalogPromise) {
396+const useSharedCache = !readOnly && !params?.metadataSnapshot;
397+if (useSharedCache && modelCatalogPromise) {
384398return modelCatalogPromise;
385399}
386400@@ -400,10 +414,12 @@ export async function loadModelCatalog(params?: {
400414const cfg = params?.config ?? getRuntimeConfig();
401415let manifestPlugins: ProviderModelIdNormalizationOptions["manifestPlugins"];
402416const getManifestPlugins = () => {
403-manifestPlugins ??= loadManifestMetadataSnapshot({
404-config: cfg,
405-env: process.env,
406-}).plugins;
417+manifestPlugins ??=
418+params?.metadataSnapshot?.plugins ??
419+loadManifestMetadataSnapshot({
420+config: cfg,
421+env: process.env,
422+}).plugins;
407423return manifestPlugins;
408424};
409425if (!readOnly) {
@@ -511,7 +527,7 @@ export async function loadModelCatalog(params?: {
511527512528if (models.length === 0) {
513529// If we found nothing, don't cache this result so we can try again.
514-if (!readOnly) {
530+if (useSharedCache) {
515531modelCatalogPromise = null;
516532}
517533}
@@ -525,7 +541,7 @@ export async function loadModelCatalog(params?: {
525541log.warn(`Failed to load model catalog: ${String(error)}`);
526542}
527543// Don't poison the cache on transient dependency/filesystem issues.
528-if (!readOnly) {
544+if (useSharedCache) {
529545modelCatalogPromise = null;
530546}
531547if (models.length > 0) {
@@ -535,7 +551,7 @@ export async function loadModelCatalog(params?: {
535551}
536552};
537553538-if (readOnly) {
554+if (readOnly || params?.metadataSnapshot) {
539555return loadCatalog();
540556}
541557此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。