openclaw
Version:
Multi-channel AI gateway with extensible messaging integrations
77 lines (76 loc) • 3.18 kB
JavaScript
import { i as getRuntimeConfig } from "./io-Gi7-pyU-.js";
//#region src/gateway/server-model-catalog.ts
const loadModelCatalogModule = async () => await import("./model-catalog-BflZHqiC.js");
function createGatewayModelCatalogCache() {
return {
lastSuccessfulCatalog: null,
inFlightRefresh: null,
staleGeneration: 0,
appliedGeneration: 0
};
}
const readOnlyModelCatalogCache = createGatewayModelCatalogCache();
const fullModelCatalogCache = createGatewayModelCatalogCache();
function resolveGatewayModelCatalogCache(params) {
return params?.readOnly === false ? fullModelCatalogCache : readOnlyModelCatalogCache;
}
function resetGatewayModelCatalogState() {
for (const cache of [readOnlyModelCatalogCache, fullModelCatalogCache]) {
cache.lastSuccessfulCatalog = null;
cache.inFlightRefresh = null;
cache.staleGeneration = 0;
cache.appliedGeneration = 0;
}
}
function isGatewayModelCatalogStale(cache) {
return cache.appliedGeneration < cache.staleGeneration;
}
async function resolveLoadModelCatalog(params) {
if (params?.loadModelCatalog) return params.loadModelCatalog;
const { loadModelCatalog } = await loadModelCatalogModule();
return loadModelCatalog;
}
function startGatewayModelCatalogRefresh(params) {
const cache = resolveGatewayModelCatalogCache(params);
const config = (params?.getConfig ?? getRuntimeConfig)();
const readOnly = params?.readOnly !== false;
const refreshGeneration = cache.staleGeneration;
const refresh = resolveLoadModelCatalog(params).then((loadModelCatalog) => loadModelCatalog({
config,
readOnly
})).then((catalog) => {
if ((readOnly || catalog.length > 0) && refreshGeneration === cache.staleGeneration) {
cache.lastSuccessfulCatalog = catalog;
cache.appliedGeneration = cache.staleGeneration;
}
return catalog;
}).finally(() => {
if (cache.inFlightRefresh === refresh) cache.inFlightRefresh = null;
});
cache.inFlightRefresh = refresh;
return refresh;
}
/** Mark cached model catalogs stale after config/plugin reload changes. */
function markGatewayModelCatalogStaleForReload() {
readOnlyModelCatalogCache.staleGeneration += 1;
fullModelCatalogCache.staleGeneration += 1;
}
async function resetModelCatalogCacheForTest() {
resetGatewayModelCatalogState();
const { resetModelCatalogCacheForTest: resetModelCatalogCacheForTestLocal } = await loadModelCatalogModule();
resetModelCatalogCacheForTestLocal();
}
/** Load the Gateway model catalog, returning cached data while stale refreshes run. */
async function loadGatewayModelCatalog(params) {
const cache = resolveGatewayModelCatalogCache(params);
const isStale = isGatewayModelCatalogStale(cache);
if (!isStale && cache.lastSuccessfulCatalog !== null) return cache.lastSuccessfulCatalog;
if (isStale && cache.lastSuccessfulCatalog !== null) {
if (!cache.inFlightRefresh) startGatewayModelCatalogRefresh(params).catch(() => void 0);
return cache.lastSuccessfulCatalog;
}
if (cache.inFlightRefresh) return await cache.inFlightRefresh;
return await startGatewayModelCatalogRefresh(params);
}
//#endregion
export { markGatewayModelCatalogStaleForReload as n, resetModelCatalogCacheForTest as r, loadGatewayModelCatalog as t };