"use client"; import { useState, useRef, useEffect } from "react"; import { aiAssistantApi } from "@/lib/api/aiAssistant"; import { Send, Loader2, Bot, User, Trash2, Settings2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent } from "@/components/ui/card"; import { ScrollArea } from "@/components/ui/scroll-area"; import { Avatar, AvatarFallback } from "@/components/ui/avatar"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { cn } from "@/lib/utils"; import { toast } from "sonner"; type ChatMessage = { role: "user" | "assistant"; content: string }; type ModelItem = { id: string }; export default function AiAssistantChatPage() { const [messages, setMessages] = useState([]); const [input, setInput] = useState(""); const [loading, setLoading] = useState(false); const [models, setModels] = useState([]); const [selectedModel, setSelectedModel] = useState("gemini-2.0-flash"); const messagesEndRef = useRef(null); useEffect(() => { aiAssistantApi.get("/models").then((res) => { const list = (res.data?.data as ModelItem[]) ?? []; setModels(list); if (list.length && !list.some((m) => m.id === selectedModel)) setSelectedModel(list[0].id); }).catch(() => {}); }, []); useEffect(() => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }, [messages]); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!input.trim() || loading) return; const userMsg: ChatMessage = { role: "user", content: input.trim() }; setMessages((prev) => [...prev, userMsg]); setInput(""); setLoading(true); try { const res = await aiAssistantApi.post("/chat/completions", { model: selectedModel, messages: [...messages, userMsg].map((m) => ({ role: m.role, content: m.content })), }); const content = (res.data as { choices?: Array<{ message?: { content?: string } }> })?.choices?.[0]?.message?.content ?? ""; setMessages((prev) => [...prev, { role: "assistant", content }]); } catch (err: unknown) { const msg = err && typeof err === "object" && "response" in err ? (err as { response?: { data?: { error?: { message?: string } } } }).response?.data?.error?.message : null; toast.error(msg ?? "AI 응답 실패"); setMessages((prev) => prev.slice(0, -1)); } finally { setLoading(false); } }; return (

AI 채팅

AI Assistant와 대화하세요.

{messages.length === 0 ? (

AI Assistant

무엇이든 물어보세요.

) : (
{messages.map((msg, i) => (
{msg.role === "user" ? : }

{msg.content}

))} {loading && (
)}
)}