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;