Skip to content

Commit 101c16b

Browse files
committed
perf(cron): lazy-load context and catalog lookups
1 parent 54eaf85 commit 101c16b

5 files changed

Lines changed: 34 additions & 9 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { lookupContextTokens } from "../../agents/context.js";
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { loadModelCatalog } from "../../agents/model-catalog.js";

src/cron/isolated-agent/run.runtime.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,8 @@ export {
55
resolveDefaultAgentId,
66
resolveAgentSkillsFilter,
77
} from "../../agents/agent-scope.js";
8-
export { lookupContextTokens } from "../../agents/context.js";
98
export { resolveCronStyleNow } from "../../agents/current-time.js";
109
export { DEFAULT_CONTEXT_TOKENS } from "../../agents/defaults.js";
11-
export { loadModelCatalog } from "../../agents/model-catalog.js";
1210
export { isCliProvider, resolveThinkingDefault } from "../../agents/model-selection.js";
1311
export { buildWorkspaceSkillSnapshot } from "../../agents/skills.js";
1412
export { getSkillsSnapshotVersion } from "../../agents/skills/refresh.js";

src/cron/isolated-agent/run.test-harness.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,8 @@ vi.mock("./run.runtime.js", () => ({
9898
resolveAgentWorkspaceDir: vi.fn().mockReturnValue("/tmp/workspace"),
9999
resolveDefaultAgentId: vi.fn().mockReturnValue("default"),
100100
resolveAgentSkillsFilter: resolveAgentSkillsFilterMock,
101-
lookupContextTokens: lookupContextTokensMock,
102101
resolveCronStyleNow: resolveCronStyleNowMock,
103102
DEFAULT_CONTEXT_TOKENS: 128000,
104-
loadModelCatalog: loadModelCatalogMock,
105103
isCliProvider: isCliProviderMock,
106104
resolveThinkingDefault: resolveThinkingDefaultMock,
107105
buildWorkspaceSkillSnapshot: buildWorkspaceSkillSnapshotMock,
@@ -126,6 +124,14 @@ vi.mock("./run.runtime.js", () => ({
126124
getRemoteSkillEligibility: getRemoteSkillEligibilityMock,
127125
}));
128126

127+
vi.mock("./run-context.runtime.js", () => ({
128+
lookupContextTokens: lookupContextTokensMock,
129+
}));
130+
131+
vi.mock("./run-model-catalog.runtime.js", () => ({
132+
loadModelCatalog: loadModelCatalogMock,
133+
}));
134+
129135
vi.mock("./run-model-selection.runtime.js", () => ({
130136
DEFAULT_MODEL: "gpt-4",
131137
DEFAULT_PROVIDER: "openai",

src/cron/isolated-agent/run.ts

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ import {
3737
hasNonzeroUsage,
3838
isCliProvider,
3939
isExternalHookSession,
40-
loadModelCatalog,
4140
logWarn,
42-
lookupContextTokens,
4341
mapHookExternalContentSource,
4442
normalizeAgentId,
4543
normalizeThinkLevel,
@@ -66,6 +64,10 @@ let sessionStoreRuntimePromise:
6664
let cronAuthProfileRuntimePromise:
6765
| Promise<typeof import("./run-auth-profile.runtime.js")>
6866
| undefined;
67+
let cronContextRuntimePromise: Promise<typeof import("./run-context.runtime.js")> | undefined;
68+
let cronModelCatalogRuntimePromise:
69+
| Promise<typeof import("./run-model-catalog.runtime.js")>
70+
| undefined;
6971

7072
async function loadSessionStoreRuntime() {
7173
sessionStoreRuntimePromise ??= import("../../config/sessions/store.runtime.js");
@@ -77,6 +79,16 @@ async function loadCronAuthProfileRuntime() {
7779
return await cronAuthProfileRuntimePromise;
7880
}
7981

82+
async function loadCronContextRuntime() {
83+
cronContextRuntimePromise ??= import("./run-context.runtime.js");
84+
return await cronContextRuntimePromise;
85+
}
86+
87+
async function loadCronModelCatalogRuntime() {
88+
cronModelCatalogRuntimePromise ??= import("./run-model-catalog.runtime.js");
89+
return await cronModelCatalogRuntimePromise;
90+
}
91+
8092
function hasConfiguredAuthProfiles(cfg: OpenClawConfig): boolean {
8193
return (
8294
Boolean(cfg.auth?.profiles && Object.keys(cfg.auth.profiles).length > 0) ||
@@ -91,6 +103,7 @@ function resolveNonNegativeNumber(value: number | undefined): number | undefined
91103
export type { RunCronAgentTurnResult } from "./run.types.js";
92104

93105
type ResolvedCronDeliveryTarget = Awaited<ReturnType<typeof resolveDeliveryTarget>>;
106+
type CronModelCatalogRuntime = typeof import("./run-model-catalog.runtime.js");
94107

95108
type IsolatedDeliveryContract = "cron-owned" | "shared";
96109

@@ -250,10 +263,14 @@ async function prepareCronRunContext(params: {
250263
...input.cfg,
251264
agents: Object.assign({}, input.cfg.agents, { defaults: agentCfg }),
252265
};
253-
let catalog: Awaited<ReturnType<typeof loadModelCatalog>> | undefined;
266+
let catalog: Awaited<ReturnType<CronModelCatalogRuntime["loadModelCatalog"]>> | undefined;
254267
const loadCatalog = async () => {
255268
if (!catalog) {
256-
catalog = await loadModelCatalog({ config: cfgWithAgentDefaults });
269+
catalog = await (
270+
await loadCronModelCatalogRuntime()
271+
).loadModelCatalog({
272+
config: cfgWithAgentDefaults,
273+
});
257274
}
258275
return catalog;
259276
};
@@ -511,7 +528,9 @@ async function finalizeCronRun(params: {
511528
execution.liveSelection.provider;
512529
const contextTokens =
513530
resolvePositiveContextTokens(prepared.agentCfg?.contextTokens) ??
514-
lookupContextTokens(modelUsed, { allowAsyncLoad: false }) ??
531+
(await loadCronContextRuntime()).lookupContextTokens(modelUsed, {
532+
allowAsyncLoad: false,
533+
}) ??
515534
resolvePositiveContextTokens(prepared.cronSession.sessionEntry.contextTokens) ??
516535
DEFAULT_CONTEXT_TOKENS;
517536

0 commit comments

Comments
 (0)