"use client"; import dynamic from "next/dynamic"; import { useLayoutEffect, useCallback, useState } from "react"; import { useTranslation } from "react-i18next"; import { streamText } from "ai"; import { toast } from "sonner"; import { LoaderCircle } from "lucide-react"; import { Dialog, DialogTitle, DialogContent, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { ScrollArea } from "@/components/ui/scroll-area"; import useModelProvider from "@/hooks/useAiProvider"; import { useTaskStore } from "@/store/task"; import { knowledgeGraphPrompt } from "@/constants/prompts"; import { parseError } from "@/utils/error"; import { cn } from "@/utils/style"; const MagicDownView = dynamic(() => import("@/components/MagicDown/View")); const MagicDownEditor = dynamic(() => import("@/components/MagicDown/Editor")); type Props = { open: boolean; onClose: () => void; }; function handleError(error: unknown) { const errorMessage = parseError(error); toast.error(errorMessage); } function KnowledgeGraph({ open, onClose }: Props) { const { t } = useTranslation(); const taskStore = useTaskStore.getState(); const { createModelProvider, getModel } = useModelProvider(); const [loading, setLoading] = useState(false); const [mode, setMode] = useState<"view" | "editor">("view"); const generateKnowledgeGraph = useCallback(async () => { const { finalReport, updateKnowledgeGraph } = useTaskStore.getState(); const { thinkingModel } = getModel(); setLoading(true); const result = streamText({ model: await createModelProvider(thinkingModel), system: knowledgeGraphPrompt + `\n\n**The node text uses the same language as the article**`, prompt: finalReport, onError: handleError, }); let text = ""; for await (const textPart of result.textStream) { text += textPart; } updateKnowledgeGraph(text); text = ""; setLoading(false); }, [createModelProvider, getModel]); function chnageMode() { if (mode === "view") { setMode("editor"); } else { setMode("view"); } } function handleClose(open: boolean) { if (!open) onClose(); } useLayoutEffect(() => { if (taskStore.knowledgeGraph === "") { generateKnowledgeGraph(); } }, [taskStore.knowledgeGraph, generateKnowledgeGraph]); return ( {loading ? (
) : ( <> {taskStore.knowledgeGraph}
taskStore.updateKnowledgeGraph(value)} hideView >
)} {!loading ? (
) : null}
); } export default KnowledgeGraph;