fix: improve error handling in HypaV3 (#808)

# PR Checklist
- [ ] Have you checked if it works normally in all models? *Ignore this
if it doesn't use models.*
- [ ] Have you checked if it works normally in all web, local, and node
hosted versions? If it doesn't, have you blocked it in those versions?
- [ ] Have you added type definitions?

# Description
This PR introduces following:
- fix: check empty summarization result in HypaV3
- fix: handle similarity search error in HypaV3
This commit is contained in:
kwaroran
2025-04-14 14:07:25 +09:00
committed by GitHub

View File

@@ -445,7 +445,11 @@ export async function hypaMemoryV3(
if (toSummarize.length > 0) { if (toSummarize.length > 0) {
const summarizeResult = await retryableSummarize(toSummarize); const summarizeResult = await retryableSummarize(toSummarize);
if (!summarizeResult.success) { if (
!summarizeResult.success ||
!summarizeResult.data ||
summarizeResult.data.trim().length === 0
) {
return { return {
currentTokens, currentTokens,
chats, chats,
@@ -642,7 +646,16 @@ export async function hypaMemoryV3(
processor.oaikey = db.supaMemoryKey; processor.oaikey = db.supaMemoryKey;
// Add summaryChunks to processor for similarity search // Add summaryChunks to processor for similarity search
await processor.addSummaryChunks(summaryChunks); try {
await processor.addSummaryChunks(summaryChunks);
} catch (error) {
return {
currentTokens,
chats,
error: `[HypaV3] Similarity search failed: ${error}`,
memory: toSerializableHypaV3Data(data),
};
}
const scoredSummaries = new Map<Summary, number>(); const scoredSummaries = new Map<Summary, number>();
@@ -652,15 +665,24 @@ export async function hypaMemoryV3(
if (!pop) break; if (!pop) break;
const searched = await processor.similaritySearchScoredEx(pop.content); try {
const searched = await processor.similaritySearchScoredEx(pop.content);
for (const [chunk, similarity] of searched) { for (const [chunk, similarity] of searched) {
const summary = chunk.summary; const summary = chunk.summary;
scoredSummaries.set( scoredSummaries.set(
summary, summary,
(scoredSummaries.get(summary) || 0) + similarity (scoredSummaries.get(summary) || 0) + similarity
); );
}
} catch (error) {
return {
currentTokens,
chats,
error: `[HypaV3] Similarity search failed: ${error}`,
memory: toSerializableHypaV3Data(data),
};
} }
} }
@@ -670,7 +692,11 @@ export async function hypaMemoryV3(
const recentChats = chats.slice(-minChatsForSimilarity); const recentChats = chats.slice(-minChatsForSimilarity);
const summarizeResult = await retryableSummarize(recentChats); const summarizeResult = await retryableSummarize(recentChats);
if (!summarizeResult.success) { if (
!summarizeResult.success ||
!summarizeResult.data ||
summarizeResult.data.trim().length === 0
) {
return { return {
currentTokens, currentTokens,
chats, chats,
@@ -679,17 +705,26 @@ export async function hypaMemoryV3(
}; };
} }
const searched = await processor.similaritySearchScoredEx( try {
summarizeResult.data const searched = await processor.similaritySearchScoredEx(
); summarizeResult.data
for (const [chunk, similarity] of searched) {
const summary = chunk.summary;
scoredSummaries.set(
summary,
(scoredSummaries.get(summary) || 0) + similarity
); );
for (const [chunk, similarity] of searched) {
const summary = chunk.summary;
scoredSummaries.set(
summary,
(scoredSummaries.get(summary) || 0) + similarity
);
}
} catch (error) {
return {
currentTokens,
chats,
error: `[HypaV3] Similarity search failed: ${error}`,
memory: toSerializableHypaV3Data(data),
};
} }
console.log("[HypaV3] Similarity corrected."); console.log("[HypaV3] Similarity corrected.");