openclaw/src/agents/system-prompt-cache-boundar...

48 lines
1.6 KiB
TypeScript

import { normalizeStructuredPromptSection } from "./prompt-cache-stability.js";
export const SYSTEM_PROMPT_CACHE_BOUNDARY = "\n<!-- OPENCLAW_CACHE_BOUNDARY -->\n";
export function stripSystemPromptCacheBoundary(text: string): string {
return text.replaceAll(SYSTEM_PROMPT_CACHE_BOUNDARY, "\n");
}
export function splitSystemPromptCacheBoundary(
text: string,
): { stablePrefix: string; dynamicSuffix: string } | undefined {
const boundaryIndex = text.indexOf(SYSTEM_PROMPT_CACHE_BOUNDARY);
if (boundaryIndex === -1) {
return undefined;
}
return {
stablePrefix: text.slice(0, boundaryIndex).trimEnd(),
dynamicSuffix: text.slice(boundaryIndex + SYSTEM_PROMPT_CACHE_BOUNDARY.length).trimStart(),
};
}
export function prependSystemPromptAdditionAfterCacheBoundary(params: {
systemPrompt: string;
systemPromptAddition?: string;
}): string {
const systemPromptAddition =
typeof params.systemPromptAddition === "string"
? normalizeStructuredPromptSection(params.systemPromptAddition)
: "";
if (!systemPromptAddition) {
return params.systemPrompt;
}
const split = splitSystemPromptCacheBoundary(params.systemPrompt);
if (!split) {
return `${systemPromptAddition}\n\n${params.systemPrompt}`;
}
const dynamicSuffix = split.dynamicSuffix
? normalizeStructuredPromptSection(split.dynamicSuffix)
: "";
if (!dynamicSuffix) {
return `${split.stablePrefix}${SYSTEM_PROMPT_CACHE_BOUNDARY}${systemPromptAddition}`;
}
return `${split.stablePrefix}${SYSTEM_PROMPT_CACHE_BOUNDARY}${systemPromptAddition}\n\n${dynamicSuffix}`;
}