fix: improve memory token tracking and logging
This commit is contained in:
@@ -283,26 +283,14 @@ export async function hypaMemoryV3(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
const emptyMemoryTokens = await tokenizer.tokenizeChat({
|
|
||||||
role: "system",
|
|
||||||
content: encapsulateMemoryPrompt(""),
|
|
||||||
});
|
|
||||||
const memoryTokens = maxContextTokens * db.hypaV3Settings.memoryTokensRatio;
|
|
||||||
const availableMemoryTokens = memoryTokens - emptyMemoryTokens;
|
|
||||||
const recentMemoryRatio =
|
|
||||||
1 -
|
|
||||||
db.hypaV3Settings.similarMemoryRatio -
|
|
||||||
db.hypaV3Settings.randomMemoryRatio;
|
|
||||||
|
|
||||||
let startIdx = 0;
|
|
||||||
let data: HypaV3Data = {
|
|
||||||
summaries: [],
|
|
||||||
};
|
|
||||||
|
|
||||||
// Initial token correction
|
// Initial token correction
|
||||||
currentTokens -= db.maxResponse;
|
currentTokens -= db.maxResponse;
|
||||||
|
|
||||||
// Load existing hypa data if available
|
// Load existing hypa data if available
|
||||||
|
let data: HypaV3Data = {
|
||||||
|
summaries: [],
|
||||||
|
};
|
||||||
|
|
||||||
if (room.hypaV3Data) {
|
if (room.hypaV3Data) {
|
||||||
data = toHypaV3Data(room.hypaV3Data);
|
data = toHypaV3Data(room.hypaV3Data);
|
||||||
}
|
}
|
||||||
@@ -313,6 +301,8 @@ export async function hypaMemoryV3(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Determine starting index
|
// Determine starting index
|
||||||
|
let startIdx = 0;
|
||||||
|
|
||||||
if (data.summaries.length > 0) {
|
if (data.summaries.length > 0) {
|
||||||
const lastSummary = data.summaries.at(-1);
|
const lastSummary = data.summaries.at(-1);
|
||||||
const lastChatIndex = chats.findIndex(
|
const lastChatIndex = chats.findIndex(
|
||||||
@@ -331,14 +321,34 @@ export async function hypaMemoryV3(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Reserve memory tokens
|
// Reserve memory tokens
|
||||||
|
const emptyMemoryTokens = await tokenizer.tokenizeChat({
|
||||||
|
role: "system",
|
||||||
|
content: encapsulateMemoryPrompt(""),
|
||||||
|
});
|
||||||
|
const memoryTokens = Math.floor(
|
||||||
|
maxContextTokens * db.hypaV3Settings.memoryTokensRatio
|
||||||
|
);
|
||||||
const shouldReserveEmptyMemoryTokens =
|
const shouldReserveEmptyMemoryTokens =
|
||||||
data.summaries.length === 0 &&
|
data.summaries.length === 0 &&
|
||||||
currentTokens + emptyMemoryTokens <= maxContextTokens;
|
currentTokens + emptyMemoryTokens <= maxContextTokens;
|
||||||
|
const availableMemoryTokens = shouldReserveEmptyMemoryTokens
|
||||||
|
? 0
|
||||||
|
: memoryTokens - emptyMemoryTokens;
|
||||||
|
|
||||||
if (shouldReserveEmptyMemoryTokens) {
|
if (shouldReserveEmptyMemoryTokens) {
|
||||||
currentTokens += emptyMemoryTokens;
|
currentTokens += emptyMemoryTokens;
|
||||||
|
console.log(
|
||||||
|
"[HypaV3] Reserved empty memory tokens:",
|
||||||
|
"\nTokens:",
|
||||||
|
emptyMemoryTokens
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
currentTokens += memoryTokens;
|
currentTokens += memoryTokens;
|
||||||
|
console.log(
|
||||||
|
"[HypaV3] Reserved max memory tokens:",
|
||||||
|
"\nTokens:",
|
||||||
|
memoryTokens
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If summarization is needed
|
// If summarization is needed
|
||||||
@@ -383,6 +393,8 @@ export async function hypaMemoryV3(
|
|||||||
startIdx,
|
startIdx,
|
||||||
"\nEnd Index:",
|
"\nEnd Index:",
|
||||||
endIdx,
|
endIdx,
|
||||||
|
"\nChat Count:",
|
||||||
|
endIdx - startIdx,
|
||||||
"\nMax Chats Per Summary:",
|
"\nMax Chats Per Summary:",
|
||||||
db.hypaV3Settings.maxChatsPerSummary
|
db.hypaV3Settings.maxChatsPerSummary
|
||||||
);
|
);
|
||||||
@@ -429,8 +441,8 @@ export async function hypaMemoryV3(
|
|||||||
"[HypaV3] Attempting summarization:",
|
"[HypaV3] Attempting summarization:",
|
||||||
"\nAttempt:",
|
"\nAttempt:",
|
||||||
summarizationFailures + 1,
|
summarizationFailures + 1,
|
||||||
"\nChat Count:",
|
"\nTarget:",
|
||||||
toSummarize.length
|
toSummarize
|
||||||
);
|
);
|
||||||
|
|
||||||
const summaryResult = await summary(stringifiedChats);
|
const summaryResult = await summary(stringifiedChats);
|
||||||
@@ -468,14 +480,21 @@ export async function hypaMemoryV3(
|
|||||||
currentTokens,
|
currentTokens,
|
||||||
"\nMax Context Tokens:",
|
"\nMax Context Tokens:",
|
||||||
maxContextTokens,
|
maxContextTokens,
|
||||||
"\nMax Memory Tokens:",
|
"\nAvailable Memory Tokens:",
|
||||||
memoryTokens
|
availableMemoryTokens
|
||||||
);
|
);
|
||||||
|
|
||||||
const selectedSummaries: Summary[] = [];
|
const selectedSummaries: Summary[] = [];
|
||||||
|
|
||||||
// Select recent summaries
|
// Select recent summaries
|
||||||
let availableRecentMemoryTokens = availableMemoryTokens * recentMemoryRatio;
|
const recentMemoryRatio =
|
||||||
|
1 -
|
||||||
|
db.hypaV3Settings.similarMemoryRatio -
|
||||||
|
db.hypaV3Settings.randomMemoryRatio;
|
||||||
|
const reservedRecentMemoryTokens = Math.floor(
|
||||||
|
availableMemoryTokens * recentMemoryRatio
|
||||||
|
);
|
||||||
|
let consumedRecentMemoryTokens = 0;
|
||||||
|
|
||||||
if (recentMemoryRatio > 0) {
|
if (recentMemoryRatio > 0) {
|
||||||
const selectedRecentSummaries: Summary[] = [];
|
const selectedRecentSummaries: Summary[] = [];
|
||||||
@@ -488,12 +507,15 @@ export async function hypaMemoryV3(
|
|||||||
content: summary.text + summarySeparator,
|
content: summary.text + summarySeparator,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (summaryTokens > availableRecentMemoryTokens) {
|
if (
|
||||||
|
summaryTokens + consumedRecentMemoryTokens >
|
||||||
|
reservedRecentMemoryTokens
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedRecentSummaries.push(summary);
|
selectedRecentSummaries.push(summary);
|
||||||
availableRecentMemoryTokens -= summaryTokens;
|
consumedRecentMemoryTokens += summaryTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedSummaries.push(...selectedRecentSummaries);
|
selectedSummaries.push(...selectedRecentSummaries);
|
||||||
@@ -504,21 +526,33 @@ export async function hypaMemoryV3(
|
|||||||
selectedRecentSummaries.length,
|
selectedRecentSummaries.length,
|
||||||
"\nSummaries:",
|
"\nSummaries:",
|
||||||
selectedRecentSummaries,
|
selectedRecentSummaries,
|
||||||
"\nTokens:",
|
"\nReserved Recent Memory Tokens:",
|
||||||
availableMemoryTokens * recentMemoryRatio - availableRecentMemoryTokens
|
reservedRecentMemoryTokens,
|
||||||
|
"\nConsumed Recent Memory Tokens:",
|
||||||
|
consumedRecentMemoryTokens
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select random summaries
|
// Select random summaries
|
||||||
let availableRandomMemoryTokens =
|
let reservedRandomMemoryTokens = Math.floor(
|
||||||
availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio;
|
availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio
|
||||||
|
);
|
||||||
|
let consumedRandomMemoryTokens = 0;
|
||||||
|
|
||||||
if (db.hypaV3Settings.randomMemoryRatio > 0) {
|
if (db.hypaV3Settings.randomMemoryRatio > 0) {
|
||||||
const selectedRandomSummaries: Summary[] = [];
|
const selectedRandomSummaries: Summary[] = [];
|
||||||
|
|
||||||
// Utilize available tokens
|
// Utilize unused token space from recent selection
|
||||||
if (db.hypaV3Settings.similarMemoryRatio === 0) {
|
if (db.hypaV3Settings.similarMemoryRatio === 0) {
|
||||||
availableRandomMemoryTokens += availableRecentMemoryTokens;
|
const unusedRecentTokens =
|
||||||
|
reservedRecentMemoryTokens - consumedRecentMemoryTokens;
|
||||||
|
|
||||||
|
reservedRandomMemoryTokens += unusedRecentTokens;
|
||||||
|
console.log(
|
||||||
|
"[HypaV3] Additional available token space for random memory:",
|
||||||
|
"\nFrom recent:",
|
||||||
|
unusedRecentTokens
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Target only summaries that haven't been selected yet
|
// Target only summaries that haven't been selected yet
|
||||||
@@ -532,13 +566,16 @@ export async function hypaMemoryV3(
|
|||||||
content: summary.text + summarySeparator,
|
content: summary.text + summarySeparator,
|
||||||
});
|
});
|
||||||
|
|
||||||
if (summaryTokens > availableRandomMemoryTokens) {
|
if (
|
||||||
|
summaryTokens + consumedRandomMemoryTokens >
|
||||||
|
reservedRandomMemoryTokens
|
||||||
|
) {
|
||||||
// Trying to select more random memory
|
// Trying to select more random memory
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedRandomSummaries.push(summary);
|
selectedRandomSummaries.push(summary);
|
||||||
availableRandomMemoryTokens -= summaryTokens;
|
consumedRandomMemoryTokens += summaryTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedSummaries.push(...selectedRandomSummaries);
|
selectedSummaries.push(...selectedRandomSummaries);
|
||||||
@@ -549,21 +586,37 @@ export async function hypaMemoryV3(
|
|||||||
selectedRandomSummaries.length,
|
selectedRandomSummaries.length,
|
||||||
"\nSummaries:",
|
"\nSummaries:",
|
||||||
selectedRandomSummaries,
|
selectedRandomSummaries,
|
||||||
"\nTokens:",
|
"\nReserved Random Memory Tokens:",
|
||||||
availableMemoryTokens * db.hypaV3Settings.randomMemoryRatio -
|
reservedRandomMemoryTokens,
|
||||||
availableRandomMemoryTokens
|
"\nConsumed Random Memory Tokens:",
|
||||||
|
consumedRandomMemoryTokens
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Select similar summaries
|
// Select similar summaries
|
||||||
if (db.hypaV3Settings.similarMemoryRatio > 0) {
|
if (db.hypaV3Settings.similarMemoryRatio > 0) {
|
||||||
|
let reservedSimilarMemoryTokens = Math.floor(
|
||||||
|
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio
|
||||||
|
);
|
||||||
|
let consumedSimilarMemoryTokens = 0;
|
||||||
const selectedSimilarSummaries: Summary[] = [];
|
const selectedSimilarSummaries: Summary[] = [];
|
||||||
let availableSimilarMemoryTokens =
|
|
||||||
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio;
|
|
||||||
|
|
||||||
// Utilize available tokens
|
// Utilize unused token space from recent and random selection
|
||||||
availableSimilarMemoryTokens +=
|
const unusedRecentTokens =
|
||||||
availableRecentMemoryTokens + availableRandomMemoryTokens;
|
reservedRecentMemoryTokens - consumedRecentMemoryTokens;
|
||||||
|
const unusedRandomTokens =
|
||||||
|
reservedRandomMemoryTokens - consumedRandomMemoryTokens;
|
||||||
|
|
||||||
|
reservedSimilarMemoryTokens += unusedRecentTokens + unusedRandomTokens;
|
||||||
|
console.log(
|
||||||
|
"[HypaV3] Additional available token space for similar memory:",
|
||||||
|
"\nFrom recent:",
|
||||||
|
unusedRecentTokens,
|
||||||
|
"\nFrom random:",
|
||||||
|
unusedRandomTokens,
|
||||||
|
"\nTotal added:",
|
||||||
|
unusedRecentTokens + unusedRandomTokens
|
||||||
|
);
|
||||||
|
|
||||||
// Target only summaries that haven't been selected yet
|
// Target only summaries that haven't been selected yet
|
||||||
const unusedSummaries = data.summaries.filter(
|
const unusedSummaries = data.summaries.filter(
|
||||||
@@ -626,8 +679,8 @@ export async function hypaMemoryV3(
|
|||||||
"[HypaV3] Attempting summarization:",
|
"[HypaV3] Attempting summarization:",
|
||||||
"\nAttempt:",
|
"\nAttempt:",
|
||||||
summarizationFailures + 1,
|
summarizationFailures + 1,
|
||||||
"\nChat Count:",
|
"\nTarget:",
|
||||||
recentChats.length
|
recentChats
|
||||||
);
|
);
|
||||||
|
|
||||||
const summaryResult = await summary(stringifiedRecentChats);
|
const summaryResult = await summary(stringifiedRecentChats);
|
||||||
@@ -691,12 +744,15 @@ export async function hypaMemoryV3(
|
|||||||
);
|
);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (summaryTokens > availableSimilarMemoryTokens) {
|
if (
|
||||||
|
summaryTokens + consumedSimilarMemoryTokens >
|
||||||
|
reservedSimilarMemoryTokens
|
||||||
|
) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedSimilarSummaries.push(summary);
|
selectedSimilarSummaries.push(summary);
|
||||||
availableSimilarMemoryTokens -= summaryTokens;
|
consumedSimilarMemoryTokens += summaryTokens;
|
||||||
}
|
}
|
||||||
|
|
||||||
selectedSummaries.push(...selectedSimilarSummaries);
|
selectedSummaries.push(...selectedSimilarSummaries);
|
||||||
@@ -707,9 +763,10 @@ export async function hypaMemoryV3(
|
|||||||
selectedSimilarSummaries.length,
|
selectedSimilarSummaries.length,
|
||||||
"\nSummaries:",
|
"\nSummaries:",
|
||||||
selectedSimilarSummaries,
|
selectedSimilarSummaries,
|
||||||
"\nTokens:",
|
"\nReserved Similar Memory Tokens:",
|
||||||
availableMemoryTokens * db.hypaV3Settings.similarMemoryRatio -
|
reservedSimilarMemoryTokens,
|
||||||
availableSimilarMemoryTokens
|
"\nConsumed Similar Memory Tokens:",
|
||||||
|
consumedSimilarMemoryTokens
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user