import { useCallback, useState } from 'react' import type { FormEvent } from 'react' import { summarize } from '../api/client.ts' import { useToast } from './shared/Toast.tsx' import Loading from './shared/Loading.tsx' import MarkdownRenderer from './shared/MarkdownRenderer.tsx' import './summary.css' interface SummaryResult { summary: string wordCount: number sourceDocuments: string[] } export default function SummarizeView() { const [maxLength, setMaxLength] = useState(500) const [isSubmitting, setIsSubmitting] = useState(false) const [result, setResult] = useState(null) const [error, setError] = useState(null) const { showToast } = useToast() const handleSubmit = useCallback( async (e: FormEvent) => { e.preventDefault() setIsSubmitting(true) setError(null) try { const res = await summarize({ max_length: maxLength }) setResult({ summary: res.summary, wordCount: res.word_count, sourceDocuments: res.source_documents, }) } catch (err) { const message = err instanceof Error ? err.message : 'Summarization failed' setError(message) showToast(message, 'error') } finally { setIsSubmitting(false) } }, [maxLength, showToast], ) return (

Document Summarization

Generate comprehensive summaries of your indexed content

setMaxLength(Number(e.target.value))} />
{maxLength} words
{error &&
{error}
} {result && (

Summary ({result.wordCount} words)

{result.sourceDocuments.length > 0 && (

Sources: {result.sourceDocuments.join(', ')}

)}
)}
) }