mirror of
https://github.com/danny-avila/LibreChat.git
synced 2026-01-03 17:18:51 +01:00
91 lines
2.3 KiB
TypeScript
91 lines
2.3 KiB
TypeScript
|
|
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;
|
||
|
|
}
|