perf(cron): lazy-load context and catalog lookups

This commit is contained in:
Vincent Koc
2026-04-13 16:53:25 +01:00
parent 54eaf85ea2
commit 101c16b0b1
5 changed files with 34 additions and 9 deletions

View File

@@ -0,0 +1 @@
export { lookupContextTokens } from "../../agents/context.js";

View File

@@ -0,0 +1 @@
export { loadModelCatalog } from "../../agents/model-catalog.js";

View File

@@ -5,10 +5,8 @@ export {
resolveDefaultAgentId,
resolveAgentSkillsFilter,
} from "../../agents/agent-scope.js";
export { lookupContextTokens } from "../../agents/context.js";
export { resolveCronStyleNow } from "../../agents/current-time.js";
export { DEFAULT_CONTEXT_TOKENS } from "../../agents/defaults.js";
export { loadModelCatalog } from "../../agents/model-catalog.js";
export { isCliProvider, resolveThinkingDefault } from "../../agents/model-selection.js";
export { buildWorkspaceSkillSnapshot } from "../../agents/skills.js";
export { getSkillsSnapshotVersion } from "../../agents/skills/refresh.js";

View File

@@ -98,10 +98,8 @@ vi.mock("./run.runtime.js", () => ({
resolveAgentWorkspaceDir: vi.fn().mockReturnValue("/tmp/workspace"),
resolveDefaultAgentId: vi.fn().mockReturnValue("default"),
resolveAgentSkillsFilter: resolveAgentSkillsFilterMock,
lookupContextTokens: lookupContextTokensMock,
resolveCronStyleNow: resolveCronStyleNowMock,
DEFAULT_CONTEXT_TOKENS: 128000,
loadModelCatalog: loadModelCatalogMock,
isCliProvider: isCliProviderMock,
resolveThinkingDefault: resolveThinkingDefaultMock,
buildWorkspaceSkillSnapshot: buildWorkspaceSkillSnapshotMock,
@@ -126,6 +124,14 @@ vi.mock("./run.runtime.js", () => ({
getRemoteSkillEligibility: getRemoteSkillEligibilityMock,
}));
vi.mock("./run-context.runtime.js", () => ({
lookupContextTokens: lookupContextTokensMock,
}));
vi.mock("./run-model-catalog.runtime.js", () => ({
loadModelCatalog: loadModelCatalogMock,
}));
vi.mock("./run-model-selection.runtime.js", () => ({
DEFAULT_MODEL: "gpt-4",
DEFAULT_PROVIDER: "openai",

View File

@@ -37,9 +37,7 @@ import {
hasNonzeroUsage,
isCliProvider,
isExternalHookSession,
loadModelCatalog,
logWarn,
lookupContextTokens,
mapHookExternalContentSource,
normalizeAgentId,
normalizeThinkLevel,
@@ -66,6 +64,10 @@ let sessionStoreRuntimePromise:
let cronAuthProfileRuntimePromise:
| Promise<typeof import("./run-auth-profile.runtime.js")>
| undefined;
let cronContextRuntimePromise: Promise<typeof import("./run-context.runtime.js")> | undefined;
let cronModelCatalogRuntimePromise:
| Promise<typeof import("./run-model-catalog.runtime.js")>
| undefined;
async function loadSessionStoreRuntime() {
sessionStoreRuntimePromise ??= import("../../config/sessions/store.runtime.js");
@@ -77,6 +79,16 @@ async function loadCronAuthProfileRuntime() {
return await cronAuthProfileRuntimePromise;
}
async function loadCronContextRuntime() {
cronContextRuntimePromise ??= import("./run-context.runtime.js");
return await cronContextRuntimePromise;
}
async function loadCronModelCatalogRuntime() {
cronModelCatalogRuntimePromise ??= import("./run-model-catalog.runtime.js");
return await cronModelCatalogRuntimePromise;
}
function hasConfiguredAuthProfiles(cfg: OpenClawConfig): boolean {
return (
Boolean(cfg.auth?.profiles && Object.keys(cfg.auth.profiles).length > 0) ||
@@ -91,6 +103,7 @@ function resolveNonNegativeNumber(value: number | undefined): number | undefined
export type { RunCronAgentTurnResult } from "./run.types.js";
type ResolvedCronDeliveryTarget = Awaited<ReturnType<typeof resolveDeliveryTarget>>;
type CronModelCatalogRuntime = typeof import("./run-model-catalog.runtime.js");
type IsolatedDeliveryContract = "cron-owned" | "shared";
@@ -250,10 +263,14 @@ async function prepareCronRunContext(params: {
...input.cfg,
agents: Object.assign({}, input.cfg.agents, { defaults: agentCfg }),
};
let catalog: Awaited<ReturnType<typeof loadModelCatalog>> | undefined;
let catalog: Awaited<ReturnType<CronModelCatalogRuntime["loadModelCatalog"]>> | undefined;
const loadCatalog = async () => {
if (!catalog) {
catalog = await loadModelCatalog({ config: cfgWithAgentDefaults });
catalog = await (
await loadCronModelCatalogRuntime()
).loadModelCatalog({
config: cfgWithAgentDefaults,
});
}
return catalog;
};
@@ -511,7 +528,9 @@ async function finalizeCronRun(params: {
execution.liveSelection.provider;
const contextTokens =
resolvePositiveContextTokens(prepared.agentCfg?.contextTokens) ??
lookupContextTokens(modelUsed, { allowAsyncLoad: false }) ??
(await loadCronContextRuntime()).lookupContextTokens(modelUsed, {
allowAsyncLoad: false,
}) ??
resolvePositiveContextTokens(prepared.cronSession.sessionEntry.contextTokens) ??
DEFAULT_CONTEXT_TOKENS;