import React from "react"; import { displayDate } from "@/_utils/datetime"; import { useStore } from "@/_models/RootStore"; import { StreamingText, StreamingTextURL, useTextBuffer } from "nextjs-openai"; import { MessageSenderType } from "@/_models/ChatMessage"; import { Role } from "@/_models/History"; type Props = { id?: string; avatarUrl?: string; senderName: string; createdAt: number; text?: string; }; const StreamTextMessage: React.FC = ({ senderName, createdAt, avatarUrl = "", }) => { const [data, setData] = React.useState(); const { historyStore } = useStore(); const conversation = historyStore?.getActiveConversation(); React.useEffect(() => { const messages = conversation?.chatMessages.slice(-5).map((e) => ({ role: e.messageSenderType === MessageSenderType.User ? Role.User : Role.Assistant, content: e.text, })); setData({ messages, stream: true, model: "gpt-3.5-turbo", max_tokens: 500, }); }, [conversation]); const { buffer, refresh, cancel } = useTextBuffer({ url: `${process.env.NEXT_PUBLIC_OPENAPI_ENDPOINT}`, throttle: 100, data, options: { headers: { "Content-Type": "application/json", }, }, }); const parsedBuffer = (buffer: String) => { try { const json = buffer.replace("data: ", ""); return JSON.parse(json).choices[0].text; } catch (e) { return ""; } }; return data ? (
{senderName}
{displayDate(createdAt)}
parsedBuffer(b))} >
) : ( <> ); }; export default React.memo(StreamTextMessage);