Spaces:
Running
Running
File size: 2,307 Bytes
a1c5622 a86b547 bc1cf4e 4af6326 ae074fc 7acedd7 a86b547 5ec491a a1c5622 4af6326 d553ae5 a1c5622 7acedd7 a1c5622 bc1cf4e a86b547 bc1cf4e 7acedd7 4af6326 84c9f51 a86b547 a1c5622 bc1cf4e ba9285c a86b547 ca7a659 d184488 a86b547 5ec491a 92f037b 5ec491a c232e44 84c9f51 d184488 c232e44 84c9f51 bc1cf4e 84c9f51 a86b547 ae074fc a1c5622 ae074fc a1c5622 bc1cf4e a86b547 |
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 |
import { useChat } from 'ai/react';
import { toast } from 'react-hot-toast';
import { useEffect, useRef } from 'react';
import { ChatWithMessages, MessageUI } from '../types';
import { convertDBMessageToAPIMessage } from '../utils/message';
import { useSetAtom } from 'jotai';
import { selectedMessageId } from '@/state/chat';
import { Message } from '@prisma/client';
import { useRouter } from 'next/navigation';
const useVisionAgent = (chat: ChatWithMessages) => {
const { messages: dbMessages, id, mediaUrl } = chat;
const latestDbMessage = dbMessages[dbMessages.length - 1];
const setMessageId = useSetAtom(selectedMessageId);
// Temporary solution for now while single we have to pass mediaUrl separately outside of the messages
const currMediaUrl = useRef<string>(mediaUrl);
const currMessageId = useRef<string>(latestDbMessage?.id);
const router = useRouter();
const { append, isLoading, data, reload } = useChat({
api: '/api/vision-agent',
onResponse(response) {
if (response.status !== 200) {
toast.error(response.statusText);
}
},
onFinish: message => {
router.refresh();
setMessageId(currMessageId.current);
},
body: {
mediaUrl: currMediaUrl.current,
chatId: id,
messageId: currMessageId.current,
// for some reason, the messages has to be stringified to be sent to the API
apiMessages: JSON.stringify(convertDBMessageToAPIMessage(dbMessages)),
},
onError: err => {
err && toast.error(err.message);
},
initialMessages: convertDBMessageToAPIMessage(dbMessages),
});
/**
* If case this is first time user navigated with init message, we need to reload the chat for the first response
*/
const once = useRef(true);
useEffect(() => {
if (!isLoading && !latestDbMessage.result && once.current) {
once.current = false;
reload();
}
}, [isLoading, latestDbMessage.result, reload]);
return {
append: (message: Message) => {
currMediaUrl.current = message.mediaUrl;
currMessageId.current = message.id;
append({
id,
role: 'user',
content: message.prompt,
});
},
data: data as unknown as PrismaJson.MessageBody[],
reload,
isLoading,
};
};
export default useVisionAgent;
|