| import type { MemoryArtifact } from 'librechat-data-provider'; | |
| import { useMemo } from 'react'; | |
| import { useLocalize } from '~/hooks'; | |
| export default function MemoryInfo({ memoryArtifacts }: { memoryArtifacts: MemoryArtifact[] }) { | |
| const localize = useLocalize(); | |
| const { updatedMemories, deletedMemories, errorMessages } = useMemo(() => { | |
| const updated = memoryArtifacts.filter((art) => art.type === 'update'); | |
| const deleted = memoryArtifacts.filter((art) => art.type === 'delete'); | |
| const errors = memoryArtifacts.filter((art) => art.type === 'error'); | |
| const messages = errors.map((artifact) => { | |
| try { | |
| const errorData = JSON.parse(artifact.value as string); | |
| if (errorData.errorType === 'already_exceeded') { | |
| return localize('com_ui_memory_already_exceeded', { | |
| tokens: errorData.tokenCount, | |
| }); | |
| } else if (errorData.errorType === 'would_exceed') { | |
| return localize('com_ui_memory_would_exceed', { | |
| tokens: errorData.tokenCount, | |
| }); | |
| } else { | |
| return localize('com_ui_memory_error'); | |
| } | |
| } catch { | |
| return localize('com_ui_memory_error'); | |
| } | |
| }); | |
| return { | |
| updatedMemories: updated, | |
| deletedMemories: deleted, | |
| errorMessages: messages, | |
| }; | |
| }, [memoryArtifacts, localize]); | |
| if (memoryArtifacts.length === 0) { | |
| return null; | |
| } | |
| if (updatedMemories.length === 0 && deletedMemories.length === 0 && errorMessages.length === 0) { | |
| return null; | |
| } | |
| return ( | |
| <div className="space-y-4 p-4"> | |
| {updatedMemories.length > 0 && ( | |
| <div> | |
| <h4 className="mb-2 text-sm font-semibold text-text-primary"> | |
| {localize('com_ui_memory_updated_items')} | |
| </h4> | |
| <div className="space-y-2"> | |
| {updatedMemories.map((artifact) => ( | |
| <div key={`update-${artifact.key}`} className="rounded-lg p-3"> | |
| <div className="mb-1 text-xs font-medium uppercase tracking-wide text-text-secondary"> | |
| {artifact.key} | |
| </div> | |
| <div className="whitespace-pre-wrap text-sm text-text-primary"> | |
| {artifact.value} | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| )} | |
| {deletedMemories.length > 0 && ( | |
| <div> | |
| <h4 className="mb-2 text-sm font-semibold text-text-primary"> | |
| {localize('com_ui_memory_deleted_items')} | |
| </h4> | |
| <div className="space-y-2"> | |
| {deletedMemories.map((artifact) => ( | |
| <div key={`delete-${artifact.key}`} className="rounded-lg p-3 opacity-60"> | |
| <div className="mb-1 text-xs font-medium uppercase tracking-wide text-text-secondary"> | |
| {artifact.key} | |
| </div> | |
| <div className="text-sm italic text-text-secondary"> | |
| {localize('com_ui_memory_deleted')} | |
| </div> | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| )} | |
| {errorMessages.length > 0 && ( | |
| <div> | |
| <h4 className="mb-2 text-sm font-semibold text-red-500"> | |
| {localize('com_ui_memory_storage_full')} | |
| </h4> | |
| <div className="space-y-2"> | |
| {errorMessages.map((errorMessage) => ( | |
| <div | |
| key={errorMessage} | |
| className="rounded-md bg-red-50 p-3 text-sm text-red-800 dark:bg-red-900/20 dark:text-red-400" | |
| > | |
| {errorMessage} | |
| </div> | |
| ))} | |
| </div> | |
| </div> | |
| )} | |
| </div> | |
| ); | |
| } | |