48 lines
1.3 KiB
TypeScript
48 lines
1.3 KiB
TypeScript
import { findCodeRegions, isInsideCode } from "./code-regions.js";
|
|
import { stripReasoningTagsFromText } from "./reasoning-tags.js";
|
|
|
|
const MEMORY_TAG_RE = /<\s*(\/?)\s*relevant[-_]memories\b[^<>]*>/gi;
|
|
const MEMORY_TAG_QUICK_RE = /<\s*\/?\s*relevant[-_]memories\b/i;
|
|
|
|
function stripRelevantMemoriesTags(text: string): string {
|
|
if (!text || !MEMORY_TAG_QUICK_RE.test(text)) {
|
|
return text;
|
|
}
|
|
MEMORY_TAG_RE.lastIndex = 0;
|
|
|
|
const codeRegions = findCodeRegions(text);
|
|
let result = "";
|
|
let lastIndex = 0;
|
|
let inMemoryBlock = false;
|
|
|
|
for (const match of text.matchAll(MEMORY_TAG_RE)) {
|
|
const idx = match.index ?? 0;
|
|
if (isInsideCode(idx, codeRegions)) {
|
|
continue;
|
|
}
|
|
|
|
const isClose = match[1] === "/";
|
|
if (!inMemoryBlock) {
|
|
result += text.slice(lastIndex, idx);
|
|
if (!isClose) {
|
|
inMemoryBlock = true;
|
|
}
|
|
} else if (isClose) {
|
|
inMemoryBlock = false;
|
|
}
|
|
|
|
lastIndex = idx + match[0].length;
|
|
}
|
|
|
|
if (!inMemoryBlock) {
|
|
result += text.slice(lastIndex);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
export function stripAssistantInternalScaffolding(text: string): string {
|
|
const withoutReasoning = stripReasoningTagsFromText(text, { mode: "preserve", trim: "start" });
|
|
return stripRelevantMemoriesTags(withoutReasoning).trimStart();
|
|
}
|