"use client"; import { Bot, MessageCircle, Send, X } from "lucide-react"; import { useState } from "react"; import { apiFetch, apiStream } from "@/lib/api"; interface AgentChatProps { employeeMode?: boolean; } interface ChatMessage { id: number; role: "user" | "agent"; content: string; } export function AgentChat({ employeeMode = false }: AgentChatProps) { const [open, setOpen] = useState(false); const [input, setInput] = useState(""); const [loading, setLoading] = useState(false); const [sessionId, setSessionId] = useState(null); const [messages, setMessages] = useState([ { id: 1, role: "agent", content: "您好,我是华夏基金智能助手。您可以咨询基金产品、风险等级和净值信息。" }, ]); async function ensureSession() { if (employeeMode) return ""; if (sessionId) return sessionId; const result = await apiFetch<{ session_id: string }>("/agent/customer/session/create", { method: "POST" }); setSessionId(result.session_id); return result.session_id; } async function sendMessage() { const content = input.trim(); if (!content || loading) return; setInput(""); setMessages((current) => [...current, { id: Date.now(), role: "user", content }]); setLoading(true); try { const activeSessionId = await ensureSession(); const response = employeeMode ? await apiStream("/advisor-agent/chat/stream", { query: content }) : await apiStream("/agent/customer/chat", { session_id: activeSessionId, query: content }); setMessages((current) => [...current, { id: Date.now() + 1, role: "agent", content: response || "暂时没有找到合适的回答,请稍后再试。" }]); } catch { setMessages((current) => [...current, { id: Date.now() + 1, role: "agent", content: "当前服务暂时不可用,请稍后再试。" }]); } finally { setLoading(false); } } async function closeChat() { setOpen(false); if (!sessionId || employeeMode) return; try { await apiFetch("/agent/customer/session/end", { method: "POST", body: JSON.stringify({ session_id: sessionId }) }); } catch { /* session cleanup is best effort */ } setSessionId(null); } return (
{open && (

华夏基金智能助手

在线为您提供基金信息服务

{messages.map((message) =>
{message.content}
)} {loading &&
正在整理信息...
}
{ event.preventDefault(); void sendMessage(); }} className="flex gap-2 border-t border-slate-200 bg-white p-3"> setInput(event.target.value)} placeholder="输入您的问题" className="min-w-0 flex-1 rounded-xl border border-slate-200 px-3 py-2.5 text-sm outline-none transition focus:border-[var(--brand-primary)]" />
)}
); }