feat: add important button in HypaV3 Data modal

This commit is contained in:
Bo26fhmC5M
2025-01-13 23:30:18 +09:00
parent a7c3141cc0
commit f3c6278d21
2 changed files with 97 additions and 44 deletions

View File

@@ -19,6 +19,7 @@ import type { ChatTokenizer } from "src/ts/tokenizer";
interface Summary {
text: string;
chatMemos: Set<string>;
isImportant: boolean;
}
interface HypaV3Data {
@@ -29,6 +30,7 @@ export interface SerializableHypaV3Data {
summaries: {
text: string;
chatMemos: string[];
isImportant: boolean;
}[];
}
@@ -50,7 +52,7 @@ function isSubset(subset: Set<string>, superset: Set<string>): boolean {
function toSerializableHypaV3Data(data: HypaV3Data): SerializableHypaV3Data {
return {
summaries: data.summaries.map((summary) => ({
text: summary.text,
...summary,
chatMemos: [...summary.chatMemos],
})),
};
@@ -59,9 +61,11 @@ function toSerializableHypaV3Data(data: HypaV3Data): SerializableHypaV3Data {
function toHypaV3Data(serialData: SerializableHypaV3Data): HypaV3Data {
return {
summaries: serialData.summaries.map((summary) => ({
text: summary.text,
...summary,
// Convert null back to undefined (JSON serialization converts undefined to null)
chatMemos: new Set(summary.chatMemos.map(memo => memo === null ? undefined : memo)),
chatMemos: new Set(
summary.chatMemos.map((memo) => (memo === null ? undefined : memo))
),
})),
};
}
@@ -288,7 +292,7 @@ export async function hypaMemoryV3(
const shouldReserveEmptyMemoryTokens =
data.summaries.length === 0 &&
currentTokens + emptyMemoryTokens <= maxContextTokens;
const availableMemoryTokens = shouldReserveEmptyMemoryTokens
let availableMemoryTokens = shouldReserveEmptyMemoryTokens
? 0
: memoryTokens - emptyMemoryTokens;
@@ -424,6 +428,7 @@ export async function hypaMemoryV3(
data.summaries.push({
text: summarizeResult.data,
chatMemos: new Set(toSummarize.map((chat) => chat.memo)),
isImportant: false,
});
break;
@@ -451,6 +456,38 @@ export async function hypaMemoryV3(
db.hypaV3Settings.recentMemoryRatio -
db.hypaV3Settings.similarMemoryRatio;
// Select important summaries
const selectedImportantSummaries: Summary[] = [];
for (const summary of data.summaries) {
if (summary.isImportant) {
const summaryTokens = await tokenizer.tokenizeChat({
role: "system",
content: summary.text + summarySeparator,
});
if (summaryTokens > availableMemoryTokens) {
break;
}
selectedImportantSummaries.push(summary);
availableMemoryTokens -= summaryTokens;
}
}
selectedSummaries.push(...selectedImportantSummaries);
console.log(
"[HypaV3] After important memory selection:",
"\nSummary Count:",
selectedImportantSummaries.length,
"\nSummaries:",
selectedImportantSummaries,
"\nAvailable Memory Tokens:",
availableMemoryTokens
);
// Select recent summaries
const reservedRecentMemoryTokens = Math.floor(
availableMemoryTokens * db.hypaV3Settings.recentMemoryRatio
@@ -460,9 +497,14 @@ export async function hypaMemoryV3(
if (db.hypaV3Settings.recentMemoryRatio > 0) {
const selectedRecentSummaries: Summary[] = [];
// Target only summaries that haven't been selected yet
const unusedSummaries = data.summaries.filter(
(e) => !selectedSummaries.includes(e)
);
// Add one by one from the end
for (let i = data.summaries.length - 1; i >= 0; i--) {
const summary = data.summaries[i];
for (let i = unusedSummaries.length - 1; i >= 0; i--) {
const summary = unusedSummaries[i];
const summaryTokens = await tokenizer.tokenizeChat({
role: "system",
content: summary.text + summarySeparator,