"use client"; import { useState } from "react"; import { BotIcon, SearchIcon, SparklesIcon } from "lucide-react"; import { toast } from "sonner"; import { debugKnowledgeAnswer, debugKnowledgeSearch, type KnowledgeAnswerResponse, type KnowledgeSearchResponse, } from "@/lib/api/admin"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Textarea } from "@/components/ui/textarea"; import { useI18n } from "@/i18n/provider"; import { getKnowledgeAnswerStatusLabel } from "@/lib/knowledge-i18n"; type DebugPanelProps = { knowledgeBaseId: number | null; }; export function DebugPanel({ knowledgeBaseId }: DebugPanelProps) { const t = useI18n(); const [question, setQuestion] = useState(""); const [topK, setTopK] = useState("5"); const [scoreThreshold, setScoreThreshold] = useState("0.2"); const [rerankLimit, setRerankLimit] = useState("5"); const [searching, setSearching] = useState(false); const [answering, setAnswering] = useState(false); const [searchResult, setSearchResult] = useState(null); const [answerResult, setAnswerResult] = useState(null); async function handleSearch() { if (!knowledgeBaseId) { toast.error(t("knowledge.selectKnowledgeBaseFirst")); return; } if (!question.trim()) { toast.error(t("knowledge.debugQuestionRequired")); return; } setSearching(true); try { const data = await debugKnowledgeSearch({ knowledgeBaseIds: [knowledgeBaseId], question: question.trim(), topK: Number(topK) || undefined, scoreThreshold: Number(scoreThreshold) || undefined, rerankLimit: Number(rerankLimit) || undefined, }); setSearchResult(data); toast.success(t("knowledge.searchCompleted", { count: data.hitCount })); } catch (error) { toast.error(error instanceof Error ? error.message : t("knowledge.searchFailed")); } finally { setSearching(false); } } async function handleAnswer() { if (!knowledgeBaseId) { toast.error(t("knowledge.selectKnowledgeBaseFirst")); return; } if (!question.trim()) { toast.error(t("knowledge.debugQuestionRequired")); return; } setAnswering(true); try { const data = await debugKnowledgeAnswer({ knowledgeBaseIds: [knowledgeBaseId], question: question.trim(), topK: Number(topK) || undefined, scoreThreshold: Number(scoreThreshold) || undefined, rerankLimit: Number(rerankLimit) || undefined, }); setAnswerResult(data); toast.success(t("knowledge.answerCompleted", { status: getKnowledgeAnswerStatusLabel(data.answerStatus, data.answerStatusName, t), })); } catch (error) { toast.error(error instanceof Error ? error.message : t("knowledge.answerFailed")); } finally { setAnswering(false); } } return (