refactor: extract repeated summarization logic into retryableSummarize function
This commit is contained in:
@@ -11,6 +11,7 @@
|
|||||||
import { alertConfirm, showHypaV3Alert } from "../../ts/alert";
|
import { alertConfirm, showHypaV3Alert } from "../../ts/alert";
|
||||||
import { DBState, alertStore, selectedCharID } from "src/ts/stores.svelte";
|
import { DBState, alertStore, selectedCharID } from "src/ts/stores.svelte";
|
||||||
import { summarize } from "src/ts/process/memory/hypav3";
|
import { summarize } from "src/ts/process/memory/hypav3";
|
||||||
|
import { type OpenAIChat } from "src/ts/process/index.svelte";
|
||||||
import { translateHTML } from "src/ts/translator/translator";
|
import { translateHTML } from "src/ts/translator/translator";
|
||||||
|
|
||||||
interface SummaryUI {
|
interface SummaryUI {
|
||||||
@@ -131,19 +132,18 @@
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const summary = hypaV3DataState.summaries[summaryIndex];
|
const summary = hypaV3DataState.summaries[summaryIndex];
|
||||||
const toSummarize = summary.chatMemos.map((chatMemo) => {
|
const toSummarize: OpenAIChat[] = summary.chatMemos.map((chatMemo) => {
|
||||||
const message = getMessageFromChatMemo(chatMemo);
|
const message = getMessageFromChatMemo(chatMemo);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...message,
|
role: (message.role === "char"
|
||||||
role: message.role === "char" ? "assistant" : message.role,
|
? "assistant"
|
||||||
|
: message.role) as OpenAIChat["role"],
|
||||||
|
content: message.data,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
const stringifiedChats = toSummarize
|
const summarizeResult = await summarize(toSummarize);
|
||||||
.map((m) => `${m.role}: ${m.data}`)
|
|
||||||
.join("\n");
|
|
||||||
const summarizeResult = await summarize(stringifiedChats);
|
|
||||||
|
|
||||||
if (summarizeResult.success) {
|
if (summarizeResult.success) {
|
||||||
summaryUIState.rerolledText = summarizeResult.data;
|
summaryUIState.rerolledText = summarizeResult.data;
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ interface SummaryChunk {
|
|||||||
summary: Summary;
|
summary: Summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const minChatsForSimilarity = 3;
|
||||||
|
const maxSummarizationFailures = 3;
|
||||||
|
const summarySeparator = "\n\n";
|
||||||
|
|
||||||
// Helper function to check if one Set is a subset of another
|
// Helper function to check if one Set is a subset of another
|
||||||
function isSubset(subset: Set<string>, superset: Set<string>): boolean {
|
function isSubset(subset: Set<string>, superset: Set<string>): boolean {
|
||||||
for (const elem of subset) {
|
for (const elem of subset) {
|
||||||
@@ -92,9 +96,12 @@ function cleanOrphanedSummary(chats: OpenAIChat[], data: HypaV3Data): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function summarize(
|
export async function summarize(
|
||||||
stringifiedChats: string
|
oaiChats: OpenAIChat[]
|
||||||
): Promise<{ success: boolean; data: string }> {
|
): Promise<{ success: boolean; data: string }> {
|
||||||
const db = getDatabase();
|
const db = getDatabase();
|
||||||
|
const stringifiedChats = oaiChats
|
||||||
|
.map((chat) => `${chat.role}: ${chat.content}`)
|
||||||
|
.join("\n");
|
||||||
|
|
||||||
if (db.supaModelType === "distilbart") {
|
if (db.supaModelType === "distilbart") {
|
||||||
try {
|
try {
|
||||||
@@ -216,6 +223,37 @@ export async function summarize(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function retryableSummarize(
|
||||||
|
oaiChats: OpenAIChat[]
|
||||||
|
): Promise<{ success: boolean; data: string }> {
|
||||||
|
let summarizationFailures = 0;
|
||||||
|
|
||||||
|
while (summarizationFailures < maxSummarizationFailures) {
|
||||||
|
console.log(
|
||||||
|
"[HypaV3] Attempting summarization:",
|
||||||
|
"\nAttempt: ",
|
||||||
|
summarizationFailures + 1,
|
||||||
|
"\nTarget: ",
|
||||||
|
oaiChats
|
||||||
|
);
|
||||||
|
|
||||||
|
const summarizeResult = await summarize(oaiChats);
|
||||||
|
|
||||||
|
if (!summarizeResult.success) {
|
||||||
|
console.log("[HypaV3] Summarization failed: ", summarizeResult.data);
|
||||||
|
summarizationFailures++;
|
||||||
|
|
||||||
|
if (summarizationFailures >= maxSummarizationFailures) {
|
||||||
|
return summarizeResult;
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
return summarizeResult;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function hypaMemoryV3(
|
export async function hypaMemoryV3(
|
||||||
chats: OpenAIChat[],
|
chats: OpenAIChat[],
|
||||||
currentTokens: number,
|
currentTokens: number,
|
||||||
@@ -229,9 +267,6 @@ export async function hypaMemoryV3(
|
|||||||
error?: string;
|
error?: string;
|
||||||
memory?: SerializableHypaV3Data;
|
memory?: SerializableHypaV3Data;
|
||||||
}> {
|
}> {
|
||||||
const minChatsForSimilarity = 3;
|
|
||||||
const maxSummarizationFailures = 3;
|
|
||||||
const summarySeparator = "\n\n";
|
|
||||||
const db = getDatabase();
|
const db = getDatabase();
|
||||||
|
|
||||||
// Validate settings
|
// Validate settings
|
||||||
@@ -396,27 +431,9 @@ export async function hypaMemoryV3(
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Attempt summarization
|
// Attempt summarization
|
||||||
let summarizationFailures = 0;
|
const summarizeResult = await retryableSummarize(toSummarize);
|
||||||
const stringifiedChats = toSummarize
|
|
||||||
.map((chat) => `${chat.role}: ${chat.content}`)
|
|
||||||
.join("\n");
|
|
||||||
|
|
||||||
while (summarizationFailures < maxSummarizationFailures) {
|
|
||||||
console.log(
|
|
||||||
"[HypaV3] Attempting summarization:",
|
|
||||||
"\nAttempt: ",
|
|
||||||
summarizationFailures + 1,
|
|
||||||
"\nTarget: ",
|
|
||||||
toSummarize
|
|
||||||
);
|
|
||||||
|
|
||||||
const summarizeResult = await summarize(stringifiedChats);
|
|
||||||
|
|
||||||
if (!summarizeResult.success) {
|
if (!summarizeResult.success) {
|
||||||
console.log("[HypaV3] Summarization failed: ", summarizeResult.data);
|
|
||||||
summarizationFailures++;
|
|
||||||
|
|
||||||
if (summarizationFailures >= maxSummarizationFailures) {
|
|
||||||
return {
|
return {
|
||||||
currentTokens,
|
currentTokens,
|
||||||
chats,
|
chats,
|
||||||
@@ -425,18 +442,12 @@ export async function hypaMemoryV3(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
data.summaries.push({
|
data.summaries.push({
|
||||||
text: summarizeResult.data,
|
text: summarizeResult.data,
|
||||||
chatMemos: new Set(toSummarize.map((chat) => chat.memo)),
|
chatMemos: new Set(toSummarize.map((chat) => chat.memo)),
|
||||||
isImportant: false,
|
isImportant: false,
|
||||||
});
|
});
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
currentTokens -= toSummarizeTokens;
|
currentTokens -= toSummarizeTokens;
|
||||||
startIdx = endIdx;
|
startIdx = endIdx;
|
||||||
}
|
}
|
||||||
@@ -611,28 +622,11 @@ export async function hypaMemoryV3(
|
|||||||
|
|
||||||
// (2) Summarized recent chat search
|
// (2) Summarized recent chat search
|
||||||
if (db.hypaV3Settings.enableSimilarityCorrection) {
|
if (db.hypaV3Settings.enableSimilarityCorrection) {
|
||||||
let summarizationFailures = 0;
|
// Attempt summarization
|
||||||
const recentChats = chats.slice(-minChatsForSimilarity);
|
const recentChats = chats.slice(-minChatsForSimilarity);
|
||||||
const stringifiedRecentChats = recentChats
|
const summarizeResult = await retryableSummarize(recentChats);
|
||||||
.map((chat) => `${chat.role}: ${chat.content}`)
|
|
||||||
.join("\n");
|
|
||||||
|
|
||||||
while (summarizationFailures < maxSummarizationFailures) {
|
|
||||||
console.log(
|
|
||||||
"[HypaV3] Attempting summarization:",
|
|
||||||
"\nAttempt: ",
|
|
||||||
summarizationFailures + 1,
|
|
||||||
"\nTarget: ",
|
|
||||||
recentChats
|
|
||||||
);
|
|
||||||
|
|
||||||
const summarizeResult = await summarize(stringifiedRecentChats);
|
|
||||||
|
|
||||||
if (!summarizeResult.success) {
|
if (!summarizeResult.success) {
|
||||||
console.log("[HypaV3] Summarization failed: ", summarizeResult.data);
|
|
||||||
summarizationFailures++;
|
|
||||||
|
|
||||||
if (summarizationFailures >= maxSummarizationFailures) {
|
|
||||||
return {
|
return {
|
||||||
currentTokens,
|
currentTokens,
|
||||||
chats,
|
chats,
|
||||||
@@ -641,9 +635,6 @@ export async function hypaMemoryV3(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const searched = await processor.similaritySearchScoredEx(
|
const searched = await processor.similaritySearchScoredEx(
|
||||||
summarizeResult.data
|
summarizeResult.data
|
||||||
);
|
);
|
||||||
@@ -658,9 +649,6 @@ export async function hypaMemoryV3(
|
|||||||
}
|
}
|
||||||
|
|
||||||
console.log("[HypaV3] Similarity corrected.");
|
console.log("[HypaV3] Similarity corrected.");
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort in descending order
|
// Sort in descending order
|
||||||
|
|||||||
Reference in New Issue
Block a user