🔧 fix: Improve Assistants File Citation & Download Handling (#2248)

* fix(processMessages): properly handle assistant file citations and add sources list

* feat: improve file download UX by making any downloaded files accessible within the app post-download

* refactor(processOpenAIImageOutput): correctly handle two different outputs for images since OpenAI generates a file in their storage, shares filepath for image rendering

* refactor: create `addFileToCache` helper to use across frontend

* refactor: add ImageFile parts to cache on processing content stream
This commit is contained in:
Danny Avila 2024-03-29 19:09:16 -04:00 committed by GitHub
parent bc2a628902
commit 6a6b2e79b0
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
11 changed files with 142 additions and 57 deletions

View file

@ -1,13 +1,18 @@
import { useCallback, useMemo } from 'react';
import { ContentTypes } from 'librechat-data-provider';
import { useQueryClient } from '@tanstack/react-query';
import type {
Text,
TMessage,
ImageFile,
TSubmission,
ContentPart,
PartMetadata,
TContentData,
TMessageContentParts,
} from 'librechat-data-provider';
import { useCallback, useMemo } from 'react';
import { addFileToCache } from '~/utils';
type TUseContentHandler = {
setMessages: (messages: TMessage[]) => void;
@ -20,6 +25,7 @@ type TContentHandler = {
};
export default function useContentHandler({ setMessages, getMessages }: TUseContentHandler) {
const queryClient = useQueryClient();
const messageMap = useMemo(() => new Map<string, TMessage>(), []);
return useCallback(
({ data, submission }: TContentHandler) => {
@ -47,10 +53,14 @@ export default function useContentHandler({ setMessages, getMessages }: TUseCont
}
// TODO: handle streaming for non-text
const textPart: Text | string = data[ContentTypes.TEXT];
const textPart: Text | string | undefined = data[ContentTypes.TEXT];
const part: ContentPart =
textPart && typeof textPart === 'string' ? { value: textPart } : data[type];
if (type === ContentTypes.IMAGE_FILE) {
addFileToCache(queryClient, part as ImageFile & PartMetadata);
}
/* spreading the content array to avoid mutation */
response.content = [...(response.content ?? [])];
@ -68,6 +78,6 @@ export default function useContentHandler({ setMessages, getMessages }: TUseCont
setMessages([...messages, response]);
},
[getMessages, messageMap, setMessages],
[queryClient, getMessages, messageMap, setMessages],
);
}