import { useState, useEffect, useRef } from 'react'; import ReactMarkdown from 'react-markdown'; import Stage1 from './Stage1'; import Stage2 from './Stage2'; import Stage3 from './Stage3'; import './ChatInterface.css'; export default function ChatInterface({ conversation, onSendMessage, isLoading, }) { const [input, setInput] = useState(''); const messagesEndRef = useRef(null); const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' }); }; useEffect(() => { scrollToBottom(); }, [conversation]); const handleSubmit = (e) => { e.preventDefault(); if (input.trim() && !isLoading) { onSendMessage(input); setInput(''); } }; const handleKeyDown = (e) => { // Submit on Enter (without Shift) if (e.key === 'Enter' && !e.shiftKey) { e.preventDefault(); handleSubmit(e); } }; if (!conversation) { return (

Welcome to LLM Council

Create a new conversation to get started

); } return (
{conversation.messages.length === 0 ? (

Start a conversation

Ask a question to consult the LLM Council

) : ( conversation.messages.map((msg, index) => (
{msg.role === 'user' ? (
You
{msg.content}
) : (
LLM Council
{/* Stage 1 */} {msg.loading?.stage1 && (
Running Stage 1: Collecting individual responses...
)} {msg.stage1 && } {/* Stage 2 */} {msg.loading?.stage2 && (
Running Stage 2: Peer rankings...
)} {msg.stage2 && ( )} {/* Stage 3 */} {msg.loading?.stage3 && (
Running Stage 3: Final synthesis...
)} {msg.stage3 && }
)}
)) )} {isLoading && (
Consulting the council...
)}
{conversation.messages.length === 0 && (