chat / client /src /utils /memory.ts
helloya20's picture
Upload 2345 files
f0743f4 verified
import type { MemoriesResponse, TUserMemory, MemoryArtifact } from 'librechat-data-provider';
type HandleMemoryArtifactParams = {
memoryArtifact: MemoryArtifact;
currentData: MemoriesResponse;
};
/**
* Pure function to handle memory artifact updates
* @param params - Object containing memoryArtifact and currentData
* @returns Updated MemoriesResponse or undefined if no update needed
*/
export function handleMemoryArtifact({
memoryArtifact,
currentData,
}: HandleMemoryArtifactParams): MemoriesResponse | undefined {
const { type, key, value, tokenCount = 0 } = memoryArtifact;
if (type === 'update' && !value) {
return undefined;
}
const memories = currentData.memories;
const existingIndex = memories.findIndex((m) => m.key === key);
if (type === 'delete') {
if (existingIndex === -1) {
return undefined;
}
const deletedMemory = memories[existingIndex];
const newMemories = [...memories];
newMemories.splice(existingIndex, 1);
const totalTokens = currentData.totalTokens - (deletedMemory.tokenCount || 0);
const usagePercentage = currentData.tokenLimit
? Math.min(100, Math.round((totalTokens / currentData.tokenLimit) * 100))
: null;
return {
...currentData,
memories: newMemories,
totalTokens,
usagePercentage,
};
}
if (type === 'update') {
const timestamp = new Date().toISOString();
let totalTokens = currentData.totalTokens;
let newMemories: TUserMemory[];
if (existingIndex >= 0) {
const oldTokenCount = memories[existingIndex].tokenCount || 0;
totalTokens = totalTokens - oldTokenCount + tokenCount;
newMemories = [...memories];
newMemories[existingIndex] = {
key,
value: value!,
tokenCount,
updated_at: timestamp,
};
} else {
totalTokens = totalTokens + tokenCount;
newMemories = [
...memories,
{
key,
value: value!,
tokenCount,
updated_at: timestamp,
},
];
}
const usagePercentage = currentData.tokenLimit
? Math.min(100, Math.round((totalTokens / currentData.tokenLimit) * 100))
: null;
return {
...currentData,
memories: newMemories,
totalTokens,
usagePercentage,
};
}
return undefined;
}