1"""JSON formatter.
2
3This module implements a JSON formatter for synthesis results, useful
4for API responses and programmatic access.
5"""
6
7from __future__ import annotations
8
9from lexigram.ai.rag.synthesis.types import SynthesisResult
10from lexigram.serialization import dumps
11
12
13class JSONFormatter:
14 """JSON response formatter.
15
16 This formatter outputs synthesis results as structured JSON with all
17 metadata and quality metrics.
18
19 Attributes:
20 indent: Indentation for pretty printing (None for compact)
21 include_chunks: Whether to include full chunk text
22 """
23
24 def __init__(
25 self,
26 indent: int = 2,
27 include_chunks: bool = False,
28 ):
29 """Initialize the JSON formatter.
30
31 Args:
32 indent: JSON indentation (None for compact)
33 include_chunks: Include full chunk text in output
34 """
35 self.indent = indent
36 self.include_chunks = include_chunks
37
38 def format(self, result: SynthesisResult) -> str:
39 """Format result as JSON.
40
41 Args:
42 result: The synthesis result
43
44 Returns:
45 JSON string
46 """
47 # Start with basic result dict
48 data = result.to_dict()
49
50 # Add context chunks info
51 if self.include_chunks:
52 data["context_chunks"] = [
53 {
54 "text": chunk.text,
55 "source": chunk.source,
56 "score": chunk.score,
57 "rank": chunk.rank,
58 "metadata": chunk.metadata,
59 }
60 for chunk in result.context_chunks
61 ]
62 else:
63 data["context_chunks"] = [
64 {
65 "source": chunk.source,
66 "score": chunk.score,
67 "rank": chunk.rank,
68 "text_length": len(chunk.text),
69 }
70 for chunk in result.context_chunks
71 ]
72
73 return dumps(data, indent=self.indent, default=str).decode("utf-8")