"use client"; import { useState, useRef } from "react"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Button } from "@/components/ui/button"; interface Message { role: "user" | "assistant"; content: string } export function OllamaChat() { const [open, setOpen] = useState(false); const [messages, setMessages] = useState([]); const [input, setInput] = useState(""); const [loading, setLoading] = useState(false); const scrollRef = useRef(null); async function send() { if (!input.trim() || loading) return; const userMsg = input.trim(); setInput(""); setMessages(prev => [...prev, { role: "user", content: userMsg }]); setLoading(true); try { const res = await fetch("/api/chat", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ message: userMsg }), }); const data = await res.json(); setMessages(prev => [...prev, { role: "assistant", content: data.response || data.error || "No response" }]); } catch (e) { setMessages(prev => [...prev, { role: "assistant", content: `Error: ${e}` }]); } setLoading(false); setTimeout(() => scrollRef.current?.scrollTo(0, scrollRef.current.scrollHeight), 100); } if (!open) { return ( ); } return (
Ollama Chat
{messages.length === 0 && (

Ask about your homelab...

{["How many containers?", "GPU status?", "What's unhealthy?", "Disk space?"].map(q => ( ))}
)} {messages.map((m, i) => (

{m.content}

))} {loading &&

Thinking...

}
setInput(e.target.value)} onKeyDown={e => e.key === "Enter" && send()} placeholder="Ask Ollama..." className="flex-1 rounded-lg glass-input px-3 py-1.5 text-xs" />
); }