diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index d4a8f978..c7295267 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -6,7 +6,7 @@ import { requestChatData } from "../request";
import { HypaProcesser } from "./hypamemory";
import { globalFetch } from "src/ts/storage/globalApi";
import { runSummarizer } from "../transformers";
-import { remove } from "lodash";
+import { last, remove } from "lodash";
export interface HypaV2Data {
chunks: {
@@ -134,6 +134,7 @@ export async function hypaMemoryV2(
// Error handling for infinite summarization attempts
let summarizationFailures = 0;
const maxSummarizationFailures = 3;
+ let lastMainChunkTargetId = '';
// Ensure correct targetId matching
const getValidChatIndex = (targetId: string) => {
@@ -146,7 +147,7 @@ export async function hypaMemoryV2(
const ind = getValidChatIndex(chunk.targetId);
if (ind !== -1) {
const removedChats = chats.splice(0, ind + 1);
- console.log("removed chats", removedChats)
+ console.log("removed chats", removedChats);
for (const chat of removedChats) {
currentTokens -= await tokenizer.tokenizeChat(chat);
}
@@ -223,18 +224,29 @@ export async function hypaMemoryV2(
if (mainPromptTokens + chunkTokens > allocatedTokens / 2) break;
mainPrompt += `\n\n${chunk.text}`;
mainPromptTokens += chunkTokens;
+ lastMainChunkTargetId = chunk.targetId;
}
// Fetch additional memory from chunks
const processor = new HypaProcesser(db.hypaModel);
processor.oaikey = db.supaMemoryKey;
+ // Find the smallest index of chunks with the same targetId as lastMainChunkTargetId
+ const lastMainChunkIndex = data.chunks.reduce((minIndex, chunk, index) => {
+ if (chunk.targetId === lastMainChunkTargetId) {
+ return Math.min(minIndex, index);
+ }
+ return minIndex;
+ }, data.chunks.length);
+
// Filter chunks to only include those older than the last mainChunk's targetId
- const lastMainChunkTargetId = data.mainChunks.length > 0 ? data.mainChunks[0].targetId : null;
- const olderChunks = lastMainChunkTargetId
- ? data.chunks.filter(chunk => getValidChatIndex(chunk.targetId) < getValidChatIndex(lastMainChunkTargetId))
+ const olderChunks = lastMainChunkIndex !== data.chunks.length
+ ? data.chunks.slice(0, lastMainChunkIndex)
: data.chunks;
- console.log(olderChunks)
+
+ console.log("Older Chunks:", olderChunks);
+
+ // Add older chunks to processor for similarity search
await processor.addText(olderChunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
let scoredResults: { [key: string]: number } = {};
@@ -250,12 +262,13 @@ export async function hypaMemoryV2(
const scoredArray = Object.entries(scoredResults).sort((a, b) => b[1] - a[1]);
let chunkResultPrompts = "";
- while (allocatedTokens - mainPromptTokens > 0 && scoredArray.length > 0) {
- const target = scoredArray.shift();
- const tokenized = await tokenizer.tokenizeChat({ role: 'system', content: target[0].substring(14) });
- if (tokenized > allocatedTokens - mainPromptTokens) break;
- chunkResultPrompts += target[0].substring(14) + '\n\n';
- mainPromptTokens += tokenized;
+ let chunkResultTokens = 0;
+ while (allocatedTokens - mainPromptTokens - chunkResultTokens > 0 && scoredArray.length > 0) {
+ const [text] = scoredArray.shift();
+ const tokenized = await tokenizer.tokenizeChat({ role: 'system', content: text.substring(14) });
+ if (tokenized > allocatedTokens - mainPromptTokens - chunkResultTokens) break;
+ chunkResultPrompts += text.substring(14) + '\n\n';
+ chunkResultTokens += tokenized;
}
const fullResult = `${mainPrompt}\n${chunkResultPrompts}`;