Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-rag/src/lexigram/ai/rag/module.py: 87%

15 statements  

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

1"""RAG pipeline module for dependency injection.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING 

6 

7from lexigram.contracts.ai.rag import ( 

8 RAGPipelineProtocol, 

9 RetrievalStrategyProtocol, 

10) 

11from lexigram.di.module import DynamicModule, Module, module 

12 

13if TYPE_CHECKING: 

14 from lexigram.ai.rag.config import RAGConfig 

15 

16 

17@module() 

18class RAGModule(Module): 

19 """Retrieval-Augmented Generation (RAG) pipeline integration. 

20 

21 Call :meth:`configure` to register the RAG pipeline, strategy registries, 

22 and supporting services (knowledge graph, HyDE, compression, reasoning) 

23 for injection. 

24 

25 Usage:: 

26 

27 from lexigram.ai.rag.config import RAGConfig 

28 

29 @module( 

30 imports=[ 

31 RAGModule.configure(RAGConfig(chunk_size=512)) 

32 ] 

33 ) 

34 class AppModule(Module): 

35 pass 

36 

37 Error Handling:: 

38 

39 RAG pipeline failures surface as typed exceptions that can be caught 

40 directly or handled via the Result pattern:: 

41 

42 from lexigram.ai.rag.exceptions import ( 

43 RAGError, # base — catch-all 

44 PreprocessingError, # document preprocessing failure 

45 RetrievalError, # retrieval / vector-store failure 

46 SynthesisError, # response synthesis failure 

47 ChunkingError, # document chunking failure 

48 ) 

49 

50 Exports: 

51 :class:`~lexigram.contracts.ai.rag.RAGPipelineProtocol`, 

52 :class:`~lexigram.contracts.ai.rag.RetrievalStrategyProtocol`, 

53 :class:`~lexigram.ai.rag.exceptions.RAGError`, 

54 :class:`~lexigram.ai.rag.exceptions.PreprocessingError`, 

55 :class:`~lexigram.ai.rag.exceptions.RetrievalError`, 

56 :class:`~lexigram.ai.rag.exceptions.SynthesisError`, 

57 :class:`~lexigram.ai.rag.exceptions.ChunkingError` 

58 """ 

59 

60 @classmethod 

61 def configure(cls, config: RAGConfig | None = None) -> DynamicModule: 

62 """Create a RAGModule with explicit configuration. 

63 

64 Args: 

65 config: :class:`~lexigram.ai.rag.config.RAGConfig` or ``None`` 

66 to use defaults (reads from environment variables). 

67 

68 Returns: 

69 A :class:`~lexigram.di.module.DynamicModule` descriptor. 

70 """ 

71 from lexigram.ai.rag.di.provider import RAGProvider 

72 

73 return DynamicModule( 

74 module=cls, 

75 providers=[RAGProvider(config=config)], 

76 exports=[ 

77 RAGPipelineProtocol, 

78 RetrievalStrategyProtocol, 

79 ], 

80 ) 

81 

82 @classmethod 

83 def stub(cls, config: RAGConfig | None = None) -> DynamicModule: 

84 """Create a RAGModule suitable for unit and integration testing. 

85 

86 Uses in-memory or no-op implementations with minimal side effects. 

87 

88 Args: 

89 config: Optional config override. Uses safe test defaults when None. 

90 

91 Returns: 

92 A :class:`~lexigram.di.module.DynamicModule` descriptor. 

93 """ 

94 from lexigram.ai.rag.di.provider import RAGProvider 

95 

96 return DynamicModule( 

97 module=cls, 

98 providers=[RAGProvider(config=config)], 

99 exports=[ 

100 RAGPipelineProtocol, 

101 RetrievalStrategyProtocol, 

102 ], 

103 ) 

104 

105 

106__all__ = ["RAGModule"]