Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-rag/src/lexigram/ai/rag/synthesis/formatters/json.py: 46%

13 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-25 07:19 +0800

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")