GuidesRecipes
DiscordDashboard
DiscordDashboard

Importing the Hook

import { useChat } from "polyfire-js/hooks";

Using the useChat hook

function useChat(): ChatInstance

useChat doesn't take any parameter returns a ChatInstance object containing all the necessary informations and functions to interact with the chat as defined below:

type Message = {
    id: string | null; // The current question/answer will be null. An id will be set to it at the end of the generation
    chat_id: string;
    is_user_message: boolean;
    content: string;
    created_at: string | null; // The current question/answer will be null. The date will be set at the end of the generation
}

type ChatInfos = {
    created_at: string;
    id: string;
    latest_message_content: string;
    latest_message_created_at: string;
    name: string | null;
    system_prompt: string | null;
    system_prompt_id: string | null;
    user_id: string;
}

type ChatBase<T> = {
    data: T | undefined;
    error: string | undefined;
    loading: boolean;
}

type Chats = ChatBase<ChatInfos[]>
type ChatHistory = ChatBase<Message[]>
type ChatAnswer = ChatBase<Message>

type ChatUtils = {
    deleteChat: (chatId: string) => Promise<void>;
    renameChat: (chatId: string, name: string) => Promise<void>;
    resetChat: () => void;
    selectChat: (chatId: string) => Promise<void>;
    sendMessage: (message: string) => Promise<void>;
};

type ChatInstance = {
    answer: ChatAnswer;
    chat: ChatInfos | undefined;
    chats: Chats;
    history: ChatHistory;
    utils: ChatUtils;
}

To send a new message, use the sendMessage function.

function sendMessage(message: string): void;

The message will be added to messages and the answer from the LLM will be updated token by token until the answer have been fully generated.

During the generation, loading will be set to true, allowing you to disable the send button.

answer.loading is also set to true during the usePolyfire initialization.

⚠️ Using sendMessage when answer.loading is true will throw an error

Example Usage

The How to make a clone of ChatGPT app could be simplified with this hook:

function App() {
    const {
        auth: { login, status },
    } = usePolyfire();
    const {
        history: { data: messages },
        utils: { onSendMessage: sendMessage },
        answer: { loading },
    } = useChat();

    return (
        <>
            {status === "unauthenticated" ? (
                <div>
                    <h1 className="font-bold">
                        Don't forget to change the project slug in src/index.tsx
                    </h1>
                    <p>
                        After that you will be able to{" "}
                        <button
                            className="cursor-pointer bg-black text-white ml-1 p-1 px-5 font-mono-font-bold"
                            onClick={() => login("github")}
                        >
                            Login With GitHub
                        </button>
                    </p>
                </div>
            ) : status === "authenticated" ? (
                <ChatBox
                    messages={messages?.slice().reverse() || []}
                    onMessage={sendMessage}
                    loading={loading}
                />
            ) : (
                "Loading..."
            )}
        </>
    );
}