import { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Button } from '@shared/components/ui/button'; import { Input } from '@shared/components/ui/input'; import { Card, CardContent } from '@shared/components/ui/card'; import { Badge } from '@shared/components/ui/badge'; import { PageContainer, PageHeader } from '@shared/components/layout'; import { MessageSquare, Send, Bot, User, BookOpen, Shield, AlertTriangle, FileText, ExternalLink } from 'lucide-react'; import { sendChatMessage } from '@/services/chatApi'; /* SFR-20: 자연어 처리 기반 AI 의사결정 지원(Q&A) 서비스 */ interface Message { role: 'user' | 'assistant'; content: string; refs?: string[]; } const SAMPLE_CONVERSATIONS = [ { id: '1', title: '서해 NLL 침범 대응 절차', time: '08:45' }, { id: '2', title: '중국어선 환적 판별 기준', time: '08:20' }, { id: '3', title: '조업 금지 기간 법령 조회', time: '어제' }, { id: '4', title: 'MMSI 변조 선박 처리 방안', time: '04-02' }, ]; const INITIAL_MESSAGES: Message[] = [ { role: 'user', content: '서해 NLL 인근에서 중국어선이 EEZ를 침범한 경우 단속 절차는 어떻게 되나요?' }, { role: 'assistant', content: `EEZ 침범 중국어선에 대한 단속 절차는 다음과 같습니다: **1단계: 탐지·식별** - AI 시스템에서 EEZ 침범 자동 탐지 (SFR-09 패턴탐지) - AIS/레이더를 통한 선박 식별 (MMSI, 선명, 국적) **2단계: 경보·출동** - 상황실 즉시 경보 발령 (SFR-17 AI 알림) - 인근 함정 출동 지시 (SFR-07 경로 추천) **3단계: 정선·검문** - VHF 16채널 정선 명령 (한·중·영) - 임검반 승선 검문 (선박서류, 어획물, 어구) **4단계: 조치** - 위반 확인 시: 나포 → 인천/목포 호송 → 담보금 부과 - 경미 위반: 경고 조치 후 퇴거 명령 **관련 법령:** - 배타적경제수역법 제5조 (외국인 어업 제한) - 한중어업협정 제6조 (특정수역 관리)`, refs: ['배타적경제수역법 제5조', '한중어업협정 제6조', 'SFR-09 패턴탐지', 'SFR-17 AI알림'] }, ]; export function AIAssistant() { const { t } = useTranslation('ai'); const { t: tc } = useTranslation('common'); const [messages, setMessages] = useState(INITIAL_MESSAGES); const [input, setInput] = useState(''); const [selectedConv, setSelectedConv] = useState('1'); const handleSend = async () => { if (!input.trim()) return; const userMsg = input; setMessages((prev) => [...prev, { role: 'user', content: userMsg }]); setInput(''); // 백엔드 prediction chat 프록시 호출 setMessages((prev) => [...prev, { role: 'assistant', content: '질의를 분석 중입니다...', refs: [] }]); try { const res = await sendChatMessage(userMsg); const reply = res.ok ? (res.reply ?? '응답 없음') : (res.message ?? 'Prediction 채팅 미연결'); setMessages((prev) => { const next = [...prev]; next[next.length - 1] = { role: 'assistant', content: reply, refs: [] }; return next; }); } catch (e) { setMessages((prev) => { const next = [...prev]; next[next.length - 1] = { role: 'assistant', content: '에러: ' + (e instanceof Error ? e.message : 'unknown'), refs: [] }; return next; }); } }; return (
{/* 대화 이력 사이드바 */}
대화 이력
{SAMPLE_CONVERSATIONS.map(c => (
setSelectedConv(c.id)} className={`px-2 py-1.5 rounded-lg cursor-pointer text-[10px] ${selectedConv === c.id ? 'bg-green-600/15 text-green-600 dark:text-green-400 border border-green-500/20' : 'text-muted-foreground hover:bg-surface-overlay'}`}>
{c.title}
{c.time}
))}
부적절 답변 필터링 활성
법령 DB 2,345건 연결
{/* 채팅 영역 */}
{messages.map((msg, i) => (
{msg.role === 'assistant' && (
)}
{msg.content}
{msg.refs && msg.refs.length > 0 && (
{msg.refs.map(r => ( {r} ))}
)}
{msg.role === 'user' && (
)}
))}
{/* 입력창 */}
setInput(e.target.value)} onKeyDown={e => e.key === 'Enter' && handleSend()} placeholder="질의를 입력하세요... (법령, 단속 절차, AI 분석 결과 등)" className="flex-1" />
); }