From 101c16b0b133e9d4d8b95663717af161627d26ad Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Mon, 13 Apr 2026 16:53:25 +0100 Subject: [PATCH] perf(cron): lazy-load context and catalog lookups --- .../isolated-agent/run-context.runtime.ts | 1 + .../run-model-catalog.runtime.ts | 1 + src/cron/isolated-agent/run.runtime.ts | 2 -- src/cron/isolated-agent/run.test-harness.ts | 10 +++++-- src/cron/isolated-agent/run.ts | 29 +++++++++++++++---- 5 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 src/cron/isolated-agent/run-context.runtime.ts create mode 100644 src/cron/isolated-agent/run-model-catalog.runtime.ts diff --git a/src/cron/isolated-agent/run-context.runtime.ts b/src/cron/isolated-agent/run-context.runtime.ts new file mode 100644 index 00000000000..a9c8f813243 --- /dev/null +++ b/src/cron/isolated-agent/run-context.runtime.ts @@ -0,0 +1 @@ +export { lookupContextTokens } from "../../agents/context.js"; diff --git a/src/cron/isolated-agent/run-model-catalog.runtime.ts b/src/cron/isolated-agent/run-model-catalog.runtime.ts new file mode 100644 index 00000000000..586a99ad338 --- /dev/null +++ b/src/cron/isolated-agent/run-model-catalog.runtime.ts @@ -0,0 +1 @@ +export { loadModelCatalog } from "../../agents/model-catalog.js"; diff --git a/src/cron/isolated-agent/run.runtime.ts b/src/cron/isolated-agent/run.runtime.ts index 9ce043d13b9..35685e19e7a 100644 --- a/src/cron/isolated-agent/run.runtime.ts +++ b/src/cron/isolated-agent/run.runtime.ts @@ -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"; diff --git a/src/cron/isolated-agent/run.test-harness.ts b/src/cron/isolated-agent/run.test-harness.ts index d855369eea5..0771e0d3d38 100644 --- a/src/cron/isolated-agent/run.test-harness.ts +++ b/src/cron/isolated-agent/run.test-harness.ts @@ -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", diff --git a/src/cron/isolated-agent/run.ts b/src/cron/isolated-agent/run.ts index c671c4c71f7..c97369cad50 100644 --- a/src/cron/isolated-agent/run.ts +++ b/src/cron/isolated-agent/run.ts @@ -37,9 +37,7 @@ import { hasNonzeroUsage, isCliProvider, isExternalHookSession, - loadModelCatalog, logWarn, - lookupContextTokens, mapHookExternalContentSource, normalizeAgentId, normalizeThinkLevel, @@ -66,6 +64,10 @@ let sessionStoreRuntimePromise: let cronAuthProfileRuntimePromise: | Promise | undefined; +let cronContextRuntimePromise: Promise | undefined; +let cronModelCatalogRuntimePromise: + | Promise + | 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>; +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> | undefined; + let catalog: Awaited> | 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;