import type { OpenClawConfig } from "../config/types.openclaw.js"; import type { ContextEngineInfo } from "../context-engine/types.js"; import { MIN_PROMPT_BUDGET_RATIO, MIN_PROMPT_BUDGET_TOKENS } from "./pi-compaction-constants.js";
export function resolveCompactionReserveTokensFloor(cfg?: OpenClawConfig): number { const raw = cfg?.agents?.defaults?.compaction?.reserveTokensFloor; if (typeof raw === "number" && Number.isFinite(raw) && raw >= 0) { return Math.floor(raw);
} return DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR;
}
function toNonNegativeInt(value: unknown): number | undefined { if (typeof value !== "number" || !Number.isFinite(value) || value < 0) { return undefined;
} return Math.floor(value);
}
function toPositiveInt(value: unknown): number | undefined { if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) { return undefined;
} return Math.floor(value);
}
export function applyPiCompactionSettingsFromConfig(params: {
settingsManager: PiSettingsManagerLike;
cfg?: OpenClawConfig; /** When known, the resolved context window budget for the current model. */
contextTokenBudget?: number;
}): {
didOverride: boolean;
compaction: { reserveTokens: number; keepRecentTokens: number };
} { const currentReserveTokens = params.settingsManager.getCompactionReserveTokens(); const currentKeepRecentTokens = params.settingsManager.getCompactionKeepRecentTokens(); const compactionCfg = params.cfg?.agents?.defaults?.compaction;
// Cap the floor to a safe fraction of the context window so that // small-context models (e.g. Ollama with 16 K tokens) are not starved of // prompt budget. Without this cap the default floor of 20 000 can exceed // the entire context window, causing every prompt to be classified as an // overflow and triggering an infinite compaction loop. const ctxBudget = params.contextTokenBudget; if (typeof ctxBudget === "number" && Number.isFinite(ctxBudget) && ctxBudget > 0) { const minPromptBudget = Math.min(
MIN_PROMPT_BUDGET_TOKENS,
Math.max(1, Math.floor(ctxBudget * MIN_PROMPT_BUDGET_RATIO)),
); const maxReserve = Math.max(0, ctxBudget - minPromptBudget);
reserveTokensFloor = Math.min(reserveTokensFloor, maxReserve);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.