| | import type { MemoriesResponse, TUserMemory, MemoryArtifact } from 'librechat-data-provider'; |
| |
|
| | type HandleMemoryArtifactParams = { |
| | memoryArtifact: MemoryArtifact; |
| | currentData: MemoriesResponse; |
| | }; |
| |
|
| | |
| | |
| | |
| | |
| | |
| | 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; |
| | } |
| |
|