File size: 2,349 Bytes
f0743f4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | 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;
}
|