1"""Plain text formatter.
2
3This module implements a simple plain text formatter for synthesis results.
4"""
5
6from __future__ import annotations
7
8from lexigram.ai.rag.synthesis.types import SynthesisResult
9
10
11class PlainTextFormatter:
12 """Plain text response formatter.
13
14 This formatter outputs synthesis results as clean plain text without
15 any markup or special formatting.
16
17 Attributes:
18 include_metadata: Whether to include metadata footer
19 include_sources: Whether to include source list
20 """
21
22 def __init__(
23 self,
24 include_metadata: bool = False,
25 include_sources: bool = True,
26 ):
27 """Initialize the plain text formatter.
28
29 Args:
30 include_metadata: Include metadata footer
31 include_sources: Include source list
32 """
33 self.include_metadata = include_metadata
34 self.include_sources = include_sources
35
36 def format(self, result: SynthesisResult) -> str:
37 """Format result as plain text.
38
39 Args:
40 result: The synthesis result
41
42 Returns:
43 Plain text output
44 """
45 parts = [result.response]
46
47 # Add sources if requested
48 if self.include_sources and result.sources:
49 parts.append("\n\nSources:")
50 for i, source in enumerate(result.sources, 1):
51 parts.append(f"{i}. {source}")
52
53 # Add metadata if requested
54 if self.include_metadata:
55 parts.append(f"\n\nStrategy: {result.strategy.value}")
56 parts.append(f"Chunks used: {result.num_chunks_used}")
57
58 if result.quality_metrics:
59 parts.append(
60 f"Confidence: {result.quality_metrics.confidence:.2f}",
61 )
62
63 return "".join(parts)