diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts
index e0600f4f..f0ca7786 100644
--- a/src/ts/process/index.ts
+++ b/src/ts/process/index.ts
@@ -714,7 +714,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
currentTokens += await tokenizer.tokenizeChat(chat)
}
- if(nowChatroom.supaMemory && (db.supaMemoryType !== 'none' || db.hanuraiEnable)){
+ if(nowChatroom.supaMemory && (db.supaModelType !== 'none' || db.hanuraiEnable)){
chatProcessStage.set(2)
if(db.hanuraiEnable){
const hn = await hanuraiMemory(chats, {
@@ -730,7 +730,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
chats = hn.chats
currentTokens = hn.tokens
}
- else if(db.supaMemoryType !== 'none' && db.hypav2){ //HypaV2 support needs to be changed like this.
+ else if(db.hypav2){ //HypaV2 support needs to be changed like this.
const sp = await hypaMemoryV2(chats, currentTokens, maxContextTokens, currentChat, nowChatroom, tokenizer)
if(sp.error){
alertError(sp.error)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index a58c2a6e..b23fa8dc 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -26,7 +26,7 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
* @param {string} stringlizedChat - The chat to be summarized, represented as a string.
* @return {Promise<{ success: boolean; data: string }>} A promise that resolves to an object containing the success status and the generated summary.
*/
- if (db.supaMemoryType === 'distilbart') {
+ if (db.supaModelType === 'distilbart') {
try {
const sum = await runSummarizer(stringlizedChat);
return { success: true, data: sum };
@@ -43,7 +43,7 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
: db.supaMemoryPrompt;
let result = '';
- if (db.supaMemoryType !== 'subModel') {
+ if (db.supaModelType !== 'subModel') {
const promptbody = stringlizedChat + '\n\n' + supaPrompt + "\n\nOutput:";
const da = await globalFetch("https://api.openai.com/v1/completions", {
headers: {
@@ -52,8 +52,8 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
},
method: "POST",
body: {
- "model": db.supaMemoryType === 'curie' ? "text-curie-001"
- : db.supaMemoryType === 'instruct35' ? 'gpt-3.5-turbo-instruct'
+ "model": db.supaModelType === 'curie' ? "text-curie-001"
+ : db.supaModelType === 'instruct35' ? 'gpt-3.5-turbo-instruct'
: "text-davinci-003",
"prompt": promptbody,
"max_tokens": 600,
@@ -220,7 +220,7 @@ export async function hypaMemoryV2(
await processor.addText(data.chunks.filter(v => {
return v.text.trim().length > 0;
}).map((v) => {
- return "search_document: " + v.text.trim();hy
+ return "search_document: " + v.text.trim();
}));
let scoredResults: { [key: string]: number } = {};
diff --git a/src/ts/process/memory/supaMemory.ts b/src/ts/process/memory/supaMemory.ts
index b2614c12..19f1f209 100644
--- a/src/ts/process/memory/supaMemory.ts
+++ b/src/ts/process/memory/supaMemory.ts
@@ -183,7 +183,7 @@ export async function supaMemory(
async function summarize(stringlizedChat:string){
- if(db.supaMemoryType === 'distilbart'){
+ if(db.supaModelType === 'distilbart'){
try {
const sum = await runSummarizer(stringlizedChat)
return sum
@@ -204,7 +204,7 @@ export async function supaMemory(
let result = ''
- if(db.supaMemoryType !== 'subModel'){
+ if(db.supaModelType !== 'subModel'){
const promptbody = stringlizedChat + '\n\n' + supaPrompt + "\n\nOutput:"
const da = await globalFetch("https://api.openai.com/v1/completions",{
@@ -214,8 +214,8 @@ export async function supaMemory(
},
method: "POST",
body: {
- "model": db.supaMemoryType === 'curie' ? "text-curie-001"
- : db.supaMemoryType === 'instruct35' ? 'gpt-3.5-turbo-instruct'
+ "model": db.supaModelType === 'curie' ? "text-curie-001"
+ : db.supaModelType === 'instruct35' ? 'gpt-3.5-turbo-instruct'
: "text-davinci-003",
"prompt": promptbody,
"max_tokens": 600,
diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts
index c776bd3c..43763884 100644
--- a/src/ts/storage/database.ts
+++ b/src/ts/storage/database.ts
@@ -230,8 +230,8 @@ export function setDatabase(data:Database){
if(checkNullish(data.supaMemoryKey)){
data.supaMemoryKey = ""
}
- if(checkNullish(data.supaMemoryType)){
- data.supaMemoryType = "none"
+ if(checkNullish(data.supaModelType)){
+ data.supaModelType = "none"
}
if(checkNullish(data.askRemoval)){
data.askRemoval = true
@@ -526,7 +526,7 @@ export interface Database{
useStreaming:boolean
palmAPI:string,
supaMemoryKey:string
- supaMemoryType:string
+ supaModelType:string
textScreenColor?:string
textBorder?:boolean
textScreenRounded?:boolean
@@ -568,7 +568,8 @@ export interface Database{
useAdditionalAssetsPreview:boolean,
usePlainFetch:boolean
hypaMemory:boolean
- hypav2:boolean // Why this is not appended?
+ hypav2:boolean
+ memoryAlgorithmType:string // To enable new memory module/algorithms
proxyRequestModel:string
ooba:OobaSettings
ainconfig: AINsettings
From 196775e5893565bd715e61706a37176532f68684 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Wed, 12 Jun 2024 20:59:14 -0700
Subject: [PATCH 07/19] Removed random punctuation
why this exists
---
src/ts/process/memory/hypav2.ts | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index a58c2a6e..982447ce 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -220,7 +220,7 @@ export async function hypaMemoryV2(
await processor.addText(data.chunks.filter(v => {
return v.text.trim().length > 0;
}).map((v) => {
- return "search_document: " + v.text.trim();hy
+ return "search_document: " + v.text.trim();
}));
let scoredResults: { [key: string]: number } = {};
From caa73666c47eea0b527249b73a49d346ac3f5957 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Thu, 13 Jun 2024 08:04:44 -0700
Subject: [PATCH 08/19] minor update
---
src/lib/Setting/Pages/OtherBotSettings.svelte | 2 +-
src/ts/process/index.ts | 4 ++--
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/lib/Setting/Pages/OtherBotSettings.svelte b/src/lib/Setting/Pages/OtherBotSettings.svelte
index d6877814..22c89b86 100644
--- a/src/lib/Setting/Pages/OtherBotSettings.svelte
+++ b/src/lib/Setting/Pages/OtherBotSettings.svelte
@@ -291,7 +291,7 @@
$DataBase.hypav2 = false
$DataBase.hanuraiEnable = true
} else if (value === 'hypaV2') {
- $DataBase.supaMemoryType = 'hypaV2'
+ $DataBase.supaMemoryType = 'distilbart'
$DataBase.hypav2= true
$DataBase.hanuraiEnable = false
} else {
diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts
index e0600f4f..057daeb7 100644
--- a/src/ts/process/index.ts
+++ b/src/ts/process/index.ts
@@ -714,7 +714,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
currentTokens += await tokenizer.tokenizeChat(chat)
}
- if(nowChatroom.supaMemory && (db.supaMemoryType !== 'none' || db.hanuraiEnable)){
+ if(nowChatroom.supaMemory && (db.supaMemoryType !== 'none' || db.hanuraiEnable || db.hypav2)){
chatProcessStage.set(2)
if(db.hanuraiEnable){
const hn = await hanuraiMemory(chats, {
@@ -730,7 +730,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
chats = hn.chats
currentTokens = hn.tokens
}
- else if(db.supaMemoryType !== 'none' && db.hypav2){ //HypaV2 support needs to be changed like this.
+ else if(db.hypav2){ //HypaV2 support needs to be changed like this.
const sp = await hypaMemoryV2(chats, currentTokens, maxContextTokens, currentChat, nowChatroom, tokenizer)
if(sp.error){
alertError(sp.error)
From d72c541437e222cc9069c48cd828addf6e1107fa Mon Sep 17 00:00:00 2001
From: HyperBlaze <73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Thu, 13 Jun 2024 13:08:43 -0700
Subject: [PATCH 09/19] changed mainprompt
made mainprompt only have most recent summarized data, which will be correctly appended on mainChunks[0]
---
src/ts/process/index.ts | 2 +-
src/ts/process/memory/hypav2.ts | 76 ++++++++++++---------------------
2 files changed, 28 insertions(+), 50 deletions(-)
diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts
index f0ca7786..9173594f 100644
--- a/src/ts/process/index.ts
+++ b/src/ts/process/index.ts
@@ -714,7 +714,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
currentTokens += await tokenizer.tokenizeChat(chat)
}
- if(nowChatroom.supaMemory && (db.supaModelType !== 'none' || db.hanuraiEnable)){
+ if(nowChatroom.supaMemory && (db.supaModelType !== 'none' || db.hanuraiEnable || db.hypav2)){
chatProcessStage.set(2)
if(db.hanuraiEnable){
const hn = await hanuraiMemory(chats, {
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index b23fa8dc..af89070d 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -126,7 +126,6 @@ export async function hypaMemoryV2(
): Promise<{ currentTokens: number; chats: OpenAIChat[]; error?: string; memory?: HypaV2Data; }> {
const db = get(DataBase);
-
const data: HypaV2Data = room.hypaV2Data ?? {
chunks: [],
mainChunks: []
@@ -134,40 +133,35 @@ export async function hypaMemoryV2(
let allocatedTokens = db.hypaAllocatedTokens;
let chunkSize = db.hypaChunkSize;
- currentTokens += allocatedTokens;
- currentTokens += 50; // this is for the template prompt
+ currentTokens += allocatedTokens + 50;
let mainPrompt = "";
- while (data.mainChunks.length > 0) {
+ // Processing mainChunks
+ if (data.mainChunks.length > 0) {
const chunk = data.mainChunks[0];
const ind = chats.findIndex(e => e.memo === chunk.targetId);
- if (ind === -1) {
- data.mainChunks.shift();
- continue;
+ if (ind !== -1) {
+ const removedChats = chats.splice(0, ind);
+ for (const chat of removedChats) {
+ currentTokens -= await tokenizer.tokenizeChat(chat);
+ }
+ chats = chats.slice(ind);
+ mainPrompt = chunk.text;
+ const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
+ allocatedTokens -= mpToken;
}
-
- const removedChats = chats.splice(0, ind);
- for (const chat of removedChats) {
- currentTokens -= await tokenizer.tokenizeChat(chat);
- }
- chats = chats.slice(ind);
- mainPrompt = chunk.text;
- const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
- allocatedTokens -= mpToken;
- break;
+ data.mainChunks.shift();
}
+ // Token management loop
while (currentTokens >= maxContextTokens) {
let idx = 0;
let targetId = '';
const halfData: OpenAIChat[] = [];
let halfDataTokens = 0;
- while (halfDataTokens < chunkSize) {
+ while (halfDataTokens < chunkSize && chats[idx]) {
const chat = chats[idx];
- if (!chat) {
- break;
- }
halfDataTokens += await tokenizer.tokenizeChat(chat);
halfData.push(chat);
idx++;
@@ -175,7 +169,6 @@ export async function hypaMemoryV2(
}
const stringlizedChat = halfData.map(e => `${e.role}: ${e.content}`).join('\n');
-
const summaryData = await summary(stringlizedChat);
if (!summaryData.success) {
@@ -187,7 +180,7 @@ export async function hypaMemoryV2(
}
const summaryDataToken = await tokenizer.tokenizeChat({ role: 'system', content: summaryData.data });
- mainPrompt += `\n\n${summaryData.data}`;
+ mainPrompt = summaryData.data; // Ensure mainPrompt only contains the latest summary
currentTokens -= halfDataTokens;
allocatedTokens -= summaryDataToken;
@@ -196,8 +189,11 @@ export async function hypaMemoryV2(
targetId: targetId
});
- if (allocatedTokens < 1500) {
+ if (allocatedTokens < 1000) {
+ console.log("Currently allocatedTokens for HypaMemoryV2 is short, thus summarizing mainPrompt twice.", allocatedTokens);
+ console.log("This is mainPrompt(summarized data): ", mainPrompt)
const summarizedMp = await summary(mainPrompt);
+ console.log("Re-summarized, expected behavior: ", summarizedMp.data)
const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
const summaryToken = await tokenizer.tokenizeChat({ role: 'system', content: summarizedMp.data });
@@ -217,50 +213,32 @@ export async function hypaMemoryV2(
const processor = new HypaProcesser(db.hypaModel);
processor.oaikey = db.supaMemoryKey;
- await processor.addText(data.chunks.filter(v => {
- return v.text.trim().length > 0;
- }).map((v) => {
- return "search_document: " + v.text.trim();
- }));
+ await processor.addText(data.chunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
let scoredResults: { [key: string]: number } = {};
for (let i = 0; i < 3; i++) {
const pop = chats[chats.length - i - 1];
- if (!pop) {
- break;
- }
+ if (!pop) break;
const searched = await processor.similaritySearchScored(`search_query: ${pop.content}`);
for (const result of searched) {
const score = result[1] / (i + 1);
- if (scoredResults[result[0]]) {
- scoredResults[result[0]] += score;
- } else {
- scoredResults[result[0]] = score;
- }
+ scoredResults[result[0]] = (scoredResults[result[0]] || 0) + score;
}
}
const scoredArray = Object.entries(scoredResults).sort((a, b) => b[1] - a[1]);
let chunkResultPrompts = "";
- while (allocatedTokens > 0) {
+ while (allocatedTokens > 0 && scoredArray.length > 0) {
const target = scoredArray.shift();
- if (!target) {
- break;
- }
- const tokenized = await tokenizer.tokenizeChat({
- role: 'system',
- content: target[0].substring(14)
- });
- if (tokenized > allocatedTokens) {
- break;
- }
+ const tokenized = await tokenizer.tokenizeChat({ role: 'system', content: target[0].substring(14) });
+ if (tokenized > allocatedTokens) break;
chunkResultPrompts += target[0].substring(14) + '\n\n';
allocatedTokens -= tokenized;
}
const fullResult = `
${mainPrompt}\n
${chunkResultPrompts}`;
-
+ console.log(fullResult, " This chat is added to system prompt for memory. ");
chats.unshift({
role: "system",
content: fullResult,
From 33bb7a333761fd513e546abbd705d2e1e8f8eeb1 Mon Sep 17 00:00:00 2001
From: HyperBlaze <73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Fri, 14 Jun 2024 17:29:11 -0700
Subject: [PATCH 10/19] updated hypav2.ts
back to original logic, only model selection is implemented.
Previous issue: the mainChunks object holds list of summarized texts, but for somewhat reason they are deleted after usage, and then re-added again, summarizing same chats.
---
src/ts/process/memory/hypav2.ts | 69 +++++++++++++++++++++------------
1 file changed, 45 insertions(+), 24 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index af89070d..99cbe787 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -20,6 +20,7 @@ export interface HypaV2Data {
async function summary(stringlizedChat: string): Promise<{ success: boolean; data: string }> {
const db = get(DataBase);
+ console.log("Summarizing with supa model: " + db.supaModelType);
/**
* Generates a summary of a given chat by using either the OpenAI API or a submodel or distilbart summarizer.
*
@@ -137,20 +138,23 @@ export async function hypaMemoryV2(
let mainPrompt = "";
// Processing mainChunks
- if (data.mainChunks.length > 0) {
- const chunk = data.mainChunks[0];
- const ind = chats.findIndex(e => e.memo === chunk.targetId);
- if (ind !== -1) {
- const removedChats = chats.splice(0, ind);
- for (const chat of removedChats) {
- currentTokens -= await tokenizer.tokenizeChat(chat);
- }
- chats = chats.slice(ind);
- mainPrompt = chunk.text;
- const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
- allocatedTokens -= mpToken;
+ while(data.mainChunks.length > 0){
+ const chunk = data.mainChunks[0]
+ const ind = chats.findIndex(e => e.memo === chunk.targetId)
+ if(ind === -1){
+ data.mainChunks.shift()
+ continue
}
- data.mainChunks.shift();
+
+ const removedChats = chats.splice(0, ind)
+ for(const chat of removedChats){
+ currentTokens -= await tokenizer.tokenizeChat(chat)
+ }
+ chats = chats.slice(ind)
+ mainPrompt = chunk.text
+ const mpToken = await tokenizer.tokenizeChat({role:'system', content:mainPrompt})
+ allocatedTokens -= mpToken
+ break
}
// Token management loop
@@ -166,6 +170,7 @@ export async function hypaMemoryV2(
halfData.push(chat);
idx++;
targetId = chat.memo;
+ console.log("current target chat: ", chat)
}
const stringlizedChat = halfData.map(e => `${e.role}: ${e.content}`).join('\n');
@@ -213,7 +218,11 @@ export async function hypaMemoryV2(
const processor = new HypaProcesser(db.hypaModel);
processor.oaikey = db.supaMemoryKey;
- await processor.addText(data.chunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
+ await processor.addText(data.chunks.filter(v => {
+ return v.text.trim().length > 0
+ }).map((v) => {
+ return "search_document: " + v.text.trim()
+ }))
let scoredResults: { [key: string]: number } = {};
for (let i = 0; i < 3; i++) {
@@ -221,32 +230,44 @@ export async function hypaMemoryV2(
if (!pop) break;
const searched = await processor.similaritySearchScored(`search_query: ${pop.content}`);
for (const result of searched) {
- const score = result[1] / (i + 1);
- scoredResults[result[0]] = (scoredResults[result[0]] || 0) + score;
- }
+ const score = result[1]/(i+1)
+ if(scoredResults[result[0]]){
+ scoredResults[result[0]] += score
+ }else{
+ scoredResults[result[0]] = score
+ }
}
const scoredArray = Object.entries(scoredResults).sort((a, b) => b[1] - a[1]);
let chunkResultPrompts = "";
- while (allocatedTokens > 0 && scoredArray.length > 0) {
- const target = scoredArray.shift();
- const tokenized = await tokenizer.tokenizeChat({ role: 'system', content: target[0].substring(14) });
- if (tokenized > allocatedTokens) break;
- chunkResultPrompts += target[0].substring(14) + '\n\n';
- allocatedTokens -= tokenized;
+ while(allocatedTokens > 0){
+ const target = scoredArray.shift()
+ if(!target){
+ break
+ }
+ const tokenized = await tokenizer.tokenizeChat({
+ role: 'system',
+ content: target[0].substring(14)
+ })
+ if(tokenized > allocatedTokens){
+ break
+ }
+ chunkResultPrompts += target[0].substring(14) + '\n\n'
+ allocatedTokens -= tokenized
}
const fullResult = `
${mainPrompt}\n
${chunkResultPrompts}`;
- console.log(fullResult, " This chat is added to system prompt for memory. ");
chats.unshift({
role: "system",
content: fullResult,
memo: "supaMemory"
});
+ console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats,"\nMemory data, with all the chunks: ", data);
return {
currentTokens: currentTokens,
chats: chats,
memory: data
};
+ }
}
From 4ef256dcf910271598d6134bf7fac5536db66826 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Sat, 15 Jun 2024 23:34:00 -0700
Subject: [PATCH 11/19] hypav2 working update
Everything works as intended.
when the first chat limit is reached, it succesfully summarize the previous chats according to the chunk size, and then returns the chat with summarized text as a system prompt, with other chats after that summarized point correctly appended.
Automatic sub-chunking also works perfectly.
Tested with sub-model.
---
src/ts/process/index.ts | 1 +
src/ts/process/memory/hypav2.ts | 119 ++++++++++++++------------------
2 files changed, 52 insertions(+), 68 deletions(-)
diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts
index 9173594f..bdd76d76 100644
--- a/src/ts/process/index.ts
+++ b/src/ts/process/index.ts
@@ -733,6 +733,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
else if(db.hypav2){ //HypaV2 support needs to be changed like this.
const sp = await hypaMemoryV2(chats, currentTokens, maxContextTokens, currentChat, nowChatroom, tokenizer)
if(sp.error){
+ console.log(sp)
alertError(sp.error)
return false
}
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index 99cbe787..950b04bf 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -1,4 +1,4 @@
-import { DataBase, type Chat, type character, type groupChat } from "src/ts/storage/database";
+import { DataBase, type Chat, type character, type groupChat } from "src/ts/storage/database";
import type { OpenAIChat } from "..";
import type { ChatTokenizer } from "src/ts/tokenizer";
import { get } from "svelte/store";
@@ -20,13 +20,8 @@ export interface HypaV2Data {
async function summary(stringlizedChat: string): Promise<{ success: boolean; data: string }> {
const db = get(DataBase);
- console.log("Summarizing with supa model: " + db.supaModelType);
- /**
- * Generates a summary of a given chat by using either the OpenAI API or a submodel or distilbart summarizer.
- *
- * @param {string} stringlizedChat - The chat to be summarized, represented as a string.
- * @return {Promise<{ success: boolean; data: string }>} A promise that resolves to an object containing the success status and the generated summary.
- */
+ console.log(db.supaModelType, " is being used for Summarization task on HypaV2Memory");
+
if (db.supaModelType === 'distilbart') {
try {
const sum = await runSummarizer(stringlizedChat);
@@ -46,28 +41,28 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
if (db.supaModelType !== 'subModel') {
const promptbody = stringlizedChat + '\n\n' + supaPrompt + "\n\nOutput:";
+
const da = await globalFetch("https://api.openai.com/v1/completions", {
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + db.supaMemoryKey
},
method: "POST",
- body: {
+ body: JSON.stringify({
"model": db.supaModelType === 'curie' ? "text-curie-001"
- : db.supaModelType === 'instruct35' ? 'gpt-3.5-turbo-instruct'
- : "text-davinci-003",
+ : db.supaModelType === 'instruct35' ? 'gpt-3.5-turbo-instruct' : "text-davinci-003",
"prompt": promptbody,
"max_tokens": 600,
"temperature": 0
- }
+ })
});
- console.log("Using openAI instruct 3.5 for SupaMemory")
+ console.log("Using Chatgpt 3.5 instruct for SupaMemory");
try {
if (!da.ok) {
return {
success: false,
- data: "SupaMemory: HTTP: " + JSON.stringify(da.data)
+ data: "SupaMemory: HTTP: " + JSON.stringify(da)
};
}
@@ -76,7 +71,7 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
if (!result) {
return {
success: false,
- data: "SupaMemory: HTTP: " + JSON.stringify(da.data)
+ data: "SupaMemory: HTTP: " + JSON.stringify(da)
};
}
@@ -98,7 +93,7 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
content: supaPrompt
}
];
- console.log("Using submodel: ", db.subModel, "for supaMemory model")
+ console.log("Using submodel: ", db.subModel, "for supaMemory model");
const da = await requestChatData({
formated: promptbody,
bias: {},
@@ -127,10 +122,7 @@ export async function hypaMemoryV2(
): Promise<{ currentTokens: number; chats: OpenAIChat[]; error?: string; memory?: HypaV2Data; }> {
const db = get(DataBase);
- const data: HypaV2Data = room.hypaV2Data ?? {
- chunks: [],
- mainChunks: []
- };
+ const data: HypaV2Data = room.hypaV2Data ?? { chunks: [], mainChunks: [] };
let allocatedTokens = db.hypaAllocatedTokens;
let chunkSize = db.hypaChunkSize;
@@ -138,23 +130,20 @@ export async function hypaMemoryV2(
let mainPrompt = "";
// Processing mainChunks
- while(data.mainChunks.length > 0){
- const chunk = data.mainChunks[0]
- const ind = chats.findIndex(e => e.memo === chunk.targetId)
- if(ind === -1){
- data.mainChunks.shift()
- continue
+ if (data.mainChunks.length > 0) {
+ const chunk = data.mainChunks[0];
+ const ind = chats.findIndex(e => e.memo === chunk.targetId);
+ if (ind !== -1) {
+ const removedChats = chats.splice(0, ind);
+ for (const chat of removedChats) {
+ currentTokens -= await tokenizer.tokenizeChat(chat);
+ }
+ chats = chats.slice(ind);
+ mainPrompt = chunk.text;
+ const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
+ allocatedTokens -= mpToken;
}
-
- const removedChats = chats.splice(0, ind)
- for(const chat of removedChats){
- currentTokens -= await tokenizer.tokenizeChat(chat)
- }
- chats = chats.slice(ind)
- mainPrompt = chunk.text
- const mpToken = await tokenizer.tokenizeChat({role:'system', content:mainPrompt})
- allocatedTokens -= mpToken
- break
+ // Do not shift here; retain for continuity
}
// Token management loop
@@ -170,7 +159,7 @@ export async function hypaMemoryV2(
halfData.push(chat);
idx++;
targetId = chat.memo;
- console.log("current target chat: ", chat)
+ console.log("current target chat Id:", targetId);
}
const stringlizedChat = halfData.map(e => `${e.role}: ${e.content}`).join('\n');
@@ -185,7 +174,7 @@ export async function hypaMemoryV2(
}
const summaryDataToken = await tokenizer.tokenizeChat({ role: 'system', content: summaryData.data });
- mainPrompt = summaryData.data; // Ensure mainPrompt only contains the latest summary
+ mainPrompt += `\n\n${summaryData.data}`;
currentTokens -= halfDataTokens;
allocatedTokens -= summaryDataToken;
@@ -196,9 +185,9 @@ export async function hypaMemoryV2(
if (allocatedTokens < 1000) {
console.log("Currently allocatedTokens for HypaMemoryV2 is short, thus summarizing mainPrompt twice.", allocatedTokens);
- console.log("This is mainPrompt(summarized data): ", mainPrompt)
+ console.log("This is mainPrompt(summarized data): ", mainPrompt);
const summarizedMp = await summary(mainPrompt);
- console.log("Re-summarized, expected behavior: ", summarizedMp.data)
+ console.log("Re-summarized, expected behavior: ", summarizedMp.data);
const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
const summaryToken = await tokenizer.tokenizeChat({ role: 'system', content: summarizedMp.data });
@@ -218,11 +207,7 @@ export async function hypaMemoryV2(
const processor = new HypaProcesser(db.hypaModel);
processor.oaikey = db.supaMemoryKey;
- await processor.addText(data.chunks.filter(v => {
- return v.text.trim().length > 0
- }).map((v) => {
- return "search_document: " + v.text.trim()
- }))
+ await processor.addText(data.chunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
let scoredResults: { [key: string]: number } = {};
for (let i = 0; i < 3; i++) {
@@ -230,44 +215,42 @@ export async function hypaMemoryV2(
if (!pop) break;
const searched = await processor.similaritySearchScored(`search_query: ${pop.content}`);
for (const result of searched) {
- const score = result[1]/(i+1)
- if(scoredResults[result[0]]){
- scoredResults[result[0]] += score
- }else{
- scoredResults[result[0]] = score
- }
+ const score = result[1] / (i + 1);
+ scoredResults[result[0]] = (scoredResults[result[0]] || 0) + score;
+ }
}
const scoredArray = Object.entries(scoredResults).sort((a, b) => b[1] - a[1]);
-
let chunkResultPrompts = "";
- while(allocatedTokens > 0){
- const target = scoredArray.shift()
- if(!target){
- break
- }
- const tokenized = await tokenizer.tokenizeChat({
- role: 'system',
- content: target[0].substring(14)
- })
- if(tokenized > allocatedTokens){
- break
- }
- chunkResultPrompts += target[0].substring(14) + '\n\n'
- allocatedTokens -= tokenized
+ while (allocatedTokens > 0 && scoredArray.length > 0) {
+ const target = scoredArray.shift();
+ const tokenized = await tokenizer.tokenizeChat({ role: 'system', content: target[0].substring(14) });
+ if (tokenized > allocatedTokens) break;
+ chunkResultPrompts += target[0].substring(14) + '\n\n';
+ allocatedTokens -= tokenized;
}
const fullResult = `
${mainPrompt}\n
${chunkResultPrompts}`;
+
chats.unshift({
role: "system",
content: fullResult,
memo: "supaMemory"
});
- console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats,"\nMemory data, with all the chunks: ", data);
+
+ // Add the remaining chats after the last mainChunk's targetId
+ if (data.mainChunks.length > 0) {
+ const lastTargetId = data.mainChunks[0].targetId;
+ const lastIndex = chats.findIndex(chat => chat.memo === lastTargetId);
+ if (lastIndex !== -1) {
+ chats.push(...chats.slice(lastIndex + 1));
+ }
+ }
+
+ console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats, "\nMemory data, with all the chunks: ", data);
return {
currentTokens: currentTokens,
chats: chats,
memory: data
};
- }
}
From e03e7f9c4bd0fbd694d60d338a1968f3f7a28546 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Sun, 16 Jun 2024 10:28:31 -0700
Subject: [PATCH 12/19] Resolved all buggy issues
why no json? Idk, blame me
---
src/ts/process/memory/hypav2.ts | 21 +++++++++++----------
1 file changed, 11 insertions(+), 10 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index 950b04bf..59435ed8 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -20,7 +20,7 @@ export interface HypaV2Data {
async function summary(stringlizedChat: string): Promise<{ success: boolean; data: string }> {
const db = get(DataBase);
- console.log(db.supaModelType, " is being used for Summarization task on HypaV2Memory");
+ console.log("Summarization actively called");
if (db.supaModelType === 'distilbart') {
try {
@@ -48,15 +48,16 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
"Authorization": "Bearer " + db.supaMemoryKey
},
method: "POST",
- body: JSON.stringify({
+ body: {
"model": db.supaModelType === 'curie' ? "text-curie-001"
- : db.supaModelType === 'instruct35' ? 'gpt-3.5-turbo-instruct' : "text-davinci-003",
+ : db.supaModelType === 'instruct35' ? 'gpt-3.5-turbo-instruct'
+ : "text-davinci-003",
"prompt": promptbody,
"max_tokens": 600,
"temperature": 0
- })
- });
- console.log("Using Chatgpt 3.5 instruct for SupaMemory");
+ }
+ })
+ console.log("Using openAI instruct 3.5 for SupaMemory");
try {
if (!da.ok) {
@@ -138,7 +139,6 @@ export async function hypaMemoryV2(
for (const chat of removedChats) {
currentTokens -= await tokenizer.tokenizeChat(chat);
}
- chats = chats.slice(ind);
mainPrompt = chunk.text;
const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
allocatedTokens -= mpToken;
@@ -239,11 +239,12 @@ export async function hypaMemoryV2(
});
// Add the remaining chats after the last mainChunk's targetId
- if (data.mainChunks.length > 0) {
- const lastTargetId = data.mainChunks[0].targetId;
+ const lastTargetId = data.mainChunks.length > 0 ? data.mainChunks[0].targetId : null;
+ if (lastTargetId) {
const lastIndex = chats.findIndex(chat => chat.memo === lastTargetId);
if (lastIndex !== -1) {
- chats.push(...chats.slice(lastIndex + 1));
+ const remainingChats = chats.slice(lastIndex + 1);
+ chats = chats.slice(0, 1).concat(remainingChats);
}
}
From dab52b6a1f7dc812205d58e6b9bd4eadf380f66d Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Sun, 16 Jun 2024 12:41:41 -0700
Subject: [PATCH 13/19] updated hypav2.ts
Logic change. Need revise.
---
src/ts/process/memory/hypav2.ts | 48 +++++++++++++++------------------
1 file changed, 22 insertions(+), 26 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index 59435ed8..81261ac7 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -41,8 +41,7 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
if (db.supaModelType !== 'subModel') {
const promptbody = stringlizedChat + '\n\n' + supaPrompt + "\n\nOutput:";
-
- const da = await globalFetch("https://api.openai.com/v1/completions", {
+ const da = await globalFetch("https://api.openai.com/v1/completions",{
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + db.supaMemoryKey
@@ -139,6 +138,7 @@ export async function hypaMemoryV2(
for (const chat of removedChats) {
currentTokens -= await tokenizer.tokenizeChat(chat);
}
+ chats = chats.slice(ind);
mainPrompt = chunk.text;
const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
allocatedTokens -= mpToken;
@@ -179,32 +179,28 @@ export async function hypaMemoryV2(
allocatedTokens -= summaryDataToken;
data.mainChunks.unshift({
- text: mainPrompt,
+ text: summaryData.data,
targetId: targetId
});
- if (allocatedTokens < 1000) {
- console.log("Currently allocatedTokens for HypaMemoryV2 is short, thus summarizing mainPrompt twice.", allocatedTokens);
- console.log("This is mainPrompt(summarized data): ", mainPrompt);
- const summarizedMp = await summary(mainPrompt);
- console.log("Re-summarized, expected behavior: ", summarizedMp.data);
- const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
- const summaryToken = await tokenizer.tokenizeChat({ role: 'system', content: summarizedMp.data });
-
- allocatedTokens -= summaryToken;
- allocatedTokens += mpToken;
-
- const splited = mainPrompt.split('\n\n').map(e => e.trim()).filter(e => e.length > 0);
-
- data.chunks.push(...splited.map(e => ({
- text: e,
- targetId: targetId
- })));
-
- data.mainChunks[0].text = mainPrompt;
- }
+ // Update chunks with the new summary
+ data.chunks.push({
+ text: summaryData.data,
+ targetId: targetId
+ });
}
+ // Construct the mainPrompt from mainChunks until half of the allocatedTokens are used
+ mainPrompt = "";
+ let mainPromptTokens = 0;
+ for (const chunk of data.mainChunks) {
+ const chunkTokens = await tokenizer.tokenizeChat({ role: 'system', content: chunk.text });
+ if (mainPromptTokens + chunkTokens > allocatedTokens / 2) break;
+ mainPrompt += `\n\n${chunk.text}`;
+ mainPromptTokens += chunkTokens;
+ }
+
+ // Fetch additional memory from chunks
const processor = new HypaProcesser(db.hypaModel);
processor.oaikey = db.supaMemoryKey;
await processor.addText(data.chunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
@@ -222,12 +218,12 @@ export async function hypaMemoryV2(
const scoredArray = Object.entries(scoredResults).sort((a, b) => b[1] - a[1]);
let chunkResultPrompts = "";
- while (allocatedTokens > 0 && scoredArray.length > 0) {
+ 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) break;
+ if (tokenized > allocatedTokens - mainPromptTokens) break;
chunkResultPrompts += target[0].substring(14) + '\n\n';
- allocatedTokens -= tokenized;
+ mainPromptTokens += tokenized;
}
const fullResult = `
${mainPrompt}\n
${chunkResultPrompts}`;
From ff52e8dd370f9e6f28d17ed6017e8baa9df0d321 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Mon, 17 Jun 2024 08:21:56 -0700
Subject: [PATCH 14/19] hypav2.ts update
one final stability check will be required..
---
src/ts/process/index.ts | 1 +
src/ts/process/memory/hypav2.ts | 48 ++++++++++++++++++++++++---------
2 files changed, 36 insertions(+), 13 deletions(-)
diff --git a/src/ts/process/index.ts b/src/ts/process/index.ts
index bdd76d76..4da73d91 100644
--- a/src/ts/process/index.ts
+++ b/src/ts/process/index.ts
@@ -732,6 +732,7 @@ export async function sendChat(chatProcessIndex = -1,arg:{chatAdditonalTokens?:n
}
else if(db.hypav2){ //HypaV2 support needs to be changed like this.
const sp = await hypaMemoryV2(chats, currentTokens, maxContextTokens, currentChat, nowChatroom, tokenizer)
+ console.log("All chats: ", chats)
if(sp.error){
console.log(sp)
alertError(sp.error)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index 81261ac7..1d72267f 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -1,4 +1,4 @@
-import { DataBase, type Chat, type character, type groupChat } from "src/ts/storage/database";
+import { DataBase, type Chat, type character, type groupChat } from "src/ts/storage/database";
import type { OpenAIChat } from "..";
import type { ChatTokenizer } from "src/ts/tokenizer";
import { get } from "svelte/store";
@@ -41,7 +41,8 @@ async function summary(stringlizedChat: string): Promise<{ success: boolean; dat
if (db.supaModelType !== 'subModel') {
const promptbody = stringlizedChat + '\n\n' + supaPrompt + "\n\nOutput:";
- const da = await globalFetch("https://api.openai.com/v1/completions",{
+
+ const da = await globalFetch("https://api.openai.com/v1/completions", {
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer " + db.supaMemoryKey
@@ -129,10 +130,19 @@ export async function hypaMemoryV2(
currentTokens += allocatedTokens + 50;
let mainPrompt = "";
+ // Error handling for infinite summarization attempts
+ let summarizationFailures = 0;
+ const maxSummarizationFailures = 3;
+
+ // Ensure correct targetId matching
+ const getValidChatIndex = (targetId: string) => {
+ return chats.findIndex(chat => chat.memo === targetId);
+ };
+
// Processing mainChunks
if (data.mainChunks.length > 0) {
const chunk = data.mainChunks[0];
- const ind = chats.findIndex(e => e.memo === chunk.targetId);
+ const ind = getValidChatIndex(chunk.targetId);
if (ind !== -1) {
const removedChats = chats.splice(0, ind);
for (const chat of removedChats) {
@@ -162,17 +172,26 @@ export async function hypaMemoryV2(
console.log("current target chat Id:", targetId);
}
+ // Avoid summarizing the last two chats
+ if (halfData.length < 3) break;
+
const stringlizedChat = halfData.map(e => `${e.role}: ${e.content}`).join('\n');
const summaryData = await summary(stringlizedChat);
if (!summaryData.success) {
- return {
- currentTokens: currentTokens,
- chats: chats,
- error: summaryData.data
- };
+ summarizationFailures++;
+ if (summarizationFailures >= maxSummarizationFailures) {
+ return {
+ currentTokens: currentTokens,
+ chats: chats,
+ error: "Summarization failed multiple times. Aborting to prevent infinite loop."
+ };
+ }
+ continue;
}
+ summarizationFailures = 0; // Reset failure counter on success
+
const summaryDataToken = await tokenizer.tokenizeChat({ role: 'system', content: summaryData.data });
mainPrompt += `\n\n${summaryData.data}`;
currentTokens -= halfDataTokens;
@@ -183,11 +202,14 @@ export async function hypaMemoryV2(
targetId: targetId
});
+ // Split the summary into chunks based on double line breaks
+ const splitted = summaryData.data.split('\n\n').map(e => e.trim()).filter(e => e.length > 0);
+
// Update chunks with the new summary
- data.chunks.push({
- text: summaryData.data,
+ data.chunks.push(...splitted.map(e => ({
+ text: e,
targetId: targetId
- });
+ })));
}
// Construct the mainPrompt from mainChunks until half of the allocatedTokens are used
@@ -237,10 +259,10 @@ export async function hypaMemoryV2(
// Add the remaining chats after the last mainChunk's targetId
const lastTargetId = data.mainChunks.length > 0 ? data.mainChunks[0].targetId : null;
if (lastTargetId) {
- const lastIndex = chats.findIndex(chat => chat.memo === lastTargetId);
+ const lastIndex = getValidChatIndex(lastTargetId);
if (lastIndex !== -1) {
const remainingChats = chats.slice(lastIndex + 1);
- chats = chats.slice(0, 1).concat(remainingChats);
+ chats = [chats[0], ...remainingChats];
}
}
From 289fe90027be3d5e0532ff57e8266d4f95e8038c Mon Sep 17 00:00:00 2001
From: HyperBlaze <73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Mon, 17 Jun 2024 15:07:07 -0700
Subject: [PATCH 15/19] Update hypav2.ts
fuck chatgpt, today is the last day and I will finish this.
---
src/ts/process/memory/hypav2.ts | 21 ++++++++++++++++++---
1 file changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index 1d72267f..cb879871 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -169,7 +169,7 @@ export async function hypaMemoryV2(
halfData.push(chat);
idx++;
targetId = chat.memo;
- console.log("current target chat Id:", targetId);
+ console.log("current target chat: ", chat);
}
// Avoid summarizing the last two chats
@@ -225,7 +225,14 @@ export async function hypaMemoryV2(
// Fetch additional memory from chunks
const processor = new HypaProcesser(db.hypaModel);
processor.oaikey = db.supaMemoryKey;
- await processor.addText(data.chunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
+
+ // 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))
+ : data.chunks;
+
+ await processor.addText(olderChunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
let scoredResults: { [key: string]: number } = {};
for (let i = 0; i < 3; i++) {
@@ -260,12 +267,20 @@ export async function hypaMemoryV2(
const lastTargetId = data.mainChunks.length > 0 ? data.mainChunks[0].targetId : null;
if (lastTargetId) {
const lastIndex = getValidChatIndex(lastTargetId);
+ console.log(chats[lastIndex])
if (lastIndex !== -1) {
- const remainingChats = chats.slice(lastIndex + 1);
+ const remainingChats = chats.slice(lastIndex);
chats = [chats[0], ...remainingChats];
}
}
+ // Add last two chats if they exist
+ const lastTwoChats = chats.slice(-2);
+ if (lastTwoChats.length === 2) {
+ chats.push(lastTwoChats[0]);
+ chats.push(lastTwoChats[1]);
+ }
+
console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats, "\nMemory data, with all the chunks: ", data);
return {
currentTokens: currentTokens,
From 21f5d61521be4bfc09c05ef0782c41cf04d7c5b0 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Mon, 17 Jun 2024 22:33:34 -0700
Subject: [PATCH 16/19] Update hypav2.ts
Still so much error :(
---
src/ts/process/memory/hypav2.ts | 32 +++++++++++++++++++-------------
1 file changed, 19 insertions(+), 13 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index cb879871..4b8a21c2 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -6,6 +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";
export interface HypaV2Data {
chunks: {
@@ -20,7 +21,7 @@ export interface HypaV2Data {
async function summary(stringlizedChat: string): Promise<{ success: boolean; data: string }> {
const db = get(DataBase);
- console.log("Summarization actively called");
+ console.log("Summarizing");
if (db.supaModelType === 'distilbart') {
try {
@@ -129,7 +130,7 @@ export async function hypaMemoryV2(
let chunkSize = db.hypaChunkSize;
currentTokens += allocatedTokens + 50;
let mainPrompt = "";
-
+ const lastTwoChats = chats.slice(-2);
// Error handling for infinite summarization attempts
let summarizationFailures = 0;
const maxSummarizationFailures = 3;
@@ -144,16 +145,17 @@ export async function hypaMemoryV2(
const chunk = data.mainChunks[0];
const ind = getValidChatIndex(chunk.targetId);
if (ind !== -1) {
- const removedChats = chats.splice(0, ind);
+ const removedChats = chats.splice(0, ind + 1);
+ console.log("removed chats", removedChats)
for (const chat of removedChats) {
currentTokens -= await tokenizer.tokenizeChat(chat);
}
- chats = chats.slice(ind);
+ chats = chats.slice(ind + 1);
mainPrompt = chunk.text;
const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
allocatedTokens -= mpToken;
}
- // Do not shift here; retain for continuity
+ // The mainChunks won't be overlapping eachother.
}
// Token management loop
@@ -163,7 +165,7 @@ export async function hypaMemoryV2(
const halfData: OpenAIChat[] = [];
let halfDataTokens = 0;
- while (halfDataTokens < chunkSize && chats[idx]) {
+ while (halfDataTokens < chunkSize && (idx <= chats.length - 4)) { // Ensure latest two chats are not added to summarization.
const chat = chats[idx];
halfDataTokens += await tokenizer.tokenizeChat(chat);
halfData.push(chat);
@@ -210,6 +212,9 @@ export async function hypaMemoryV2(
text: e,
targetId: targetId
})));
+
+ // Remove summarized chats
+ chats.splice(0, idx);
}
// Construct the mainPrompt from mainChunks until half of the allocatedTokens are used
@@ -231,7 +236,7 @@ export async function hypaMemoryV2(
const olderChunks = lastMainChunkTargetId
? data.chunks.filter(chunk => getValidChatIndex(chunk.targetId) < getValidChatIndex(lastMainChunkTargetId))
: data.chunks;
-
+ console.log(olderChunks)
await processor.addText(olderChunks.filter(v => v.text.trim().length > 0).map(v => "search_document: " + v.text.trim()));
let scoredResults: { [key: string]: number } = {};
@@ -267,20 +272,21 @@ export async function hypaMemoryV2(
const lastTargetId = data.mainChunks.length > 0 ? data.mainChunks[0].targetId : null;
if (lastTargetId) {
const lastIndex = getValidChatIndex(lastTargetId);
- console.log(chats[lastIndex])
+ console.log(chats[lastIndex], lastIndex)
if (lastIndex !== -1) {
- const remainingChats = chats.slice(lastIndex);
- chats = [chats[0], ...remainingChats];
+ const remainingChats = chats.slice(lastIndex + 1);
+ chats = [chats[0]]
+ chats.push(...remainingChats);
+ } else {
+ chats = chats
}
- }
+ }
// Add last two chats if they exist
- const lastTwoChats = chats.slice(-2);
if (lastTwoChats.length === 2) {
chats.push(lastTwoChats[0]);
chats.push(lastTwoChats[1]);
}
-
console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats, "\nMemory data, with all the chunks: ", data);
return {
currentTokens: currentTokens,
From e530783eb6de91b8cfe425c362be486913742d74 Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Mon, 17 Jun 2024 23:38:48 -0700
Subject: [PATCH 17/19] Stable update hypav2.ts
no joke, now really works.
---
src/ts/process/memory/hypav2.ts | 13 +++++--------
1 file changed, 5 insertions(+), 8 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index 4b8a21c2..b4cbe35a 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -150,12 +150,10 @@ export async function hypaMemoryV2(
for (const chat of removedChats) {
currentTokens -= await tokenizer.tokenizeChat(chat);
}
- chats = chats.slice(ind + 1);
mainPrompt = chunk.text;
const mpToken = await tokenizer.tokenizeChat({ role: 'system', content: mainPrompt });
allocatedTokens -= mpToken;
}
- // The mainChunks won't be overlapping eachother.
}
// Token management loop
@@ -272,21 +270,20 @@ export async function hypaMemoryV2(
const lastTargetId = data.mainChunks.length > 0 ? data.mainChunks[0].targetId : null;
if (lastTargetId) {
const lastIndex = getValidChatIndex(lastTargetId);
- console.log(chats[lastIndex], lastIndex)
if (lastIndex !== -1) {
const remainingChats = chats.slice(lastIndex + 1);
- chats = [chats[0]]
- chats.push(...remainingChats);
- } else {
- chats = chats
- }
+ chats = [chats[0], ...remainingChats];
+ }
}
// Add last two chats if they exist
+ // Yeah, It's fine to remove this, but for the sake of stability, currently commented it out. Will add stabilizer for this
+ /*
if (lastTwoChats.length === 2) {
chats.push(lastTwoChats[0]);
chats.push(lastTwoChats[1]);
}
+ */
console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats, "\nMemory data, with all the chunks: ", data);
return {
currentTokens: currentTokens,
From b17cf1e532dd91e5720b545e9caa5847043f586e Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Mon, 17 Jun 2024 23:45:03 -0700
Subject: [PATCH 18/19] minimal changes on last two chats
hypav2.ts update. last commit.
---
src/ts/process/memory/hypav2.ts | 15 +++++++++------
1 file changed, 9 insertions(+), 6 deletions(-)
diff --git a/src/ts/process/memory/hypav2.ts b/src/ts/process/memory/hypav2.ts
index b4cbe35a..d4a8f978 100644
--- a/src/ts/process/memory/hypav2.ts
+++ b/src/ts/process/memory/hypav2.ts
@@ -276,14 +276,17 @@ export async function hypaMemoryV2(
}
}
- // Add last two chats if they exist
- // Yeah, It's fine to remove this, but for the sake of stability, currently commented it out. Will add stabilizer for this
- /*
+ // Add last two chats if they exist and are not duplicates
if (lastTwoChats.length === 2) {
- chats.push(lastTwoChats[0]);
- chats.push(lastTwoChats[1]);
+ const [lastChat1, lastChat2] = lastTwoChats;
+ if (!chats.some(chat => chat.memo === lastChat1.memo)) {
+ chats.push(lastChat1);
+ }
+ if (!chats.some(chat => chat.memo === lastChat2.memo)) {
+ chats.push(lastChat2);
+ }
}
- */
+
console.log("model being used: ", db.hypaModel, db.supaModelType, "\nCurrent session tokens: ", currentTokens, "\nAll chats, including memory system prompt: ", chats, "\nMemory data, with all the chunks: ", data);
return {
currentTokens: currentTokens,
From 8d883990bbd9925a449de1bf4f533d6129e48b3e Mon Sep 17 00:00:00 2001
From: LightningHyperBlaze45654
<73149145+LightningHyperBlaze45654@users.noreply.github.com>
Date: Tue, 18 Jun 2024 08:23:57 -0700
Subject: [PATCH 19/19] Update hypav2.ts
Now retrieving works as intended
---
src/ts/process/memory/hypav2.ts | 37 ++++++++++++++++++++++-----------
1 file changed, 25 insertions(+), 12 deletions(-)
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}`;