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
« prev ^ index » next coverage.py v7.15.4, created at 2026-08-25 07:19 +0800
1"""RAG pipeline module for dependency injection."""
3from __future__ import annotations
5from typing import TYPE_CHECKING
7from lexigram.contracts.ai.rag import (
8 RAGPipelineProtocol,
9 RetrievalStrategyProtocol,
10)
11from lexigram.di.module import DynamicModule, Module, module
13if TYPE_CHECKING:
14 from lexigram.ai.rag.config import RAGConfig
17@module()
18class RAGModule(Module):
19 """Retrieval-Augmented Generation (RAG) pipeline integration.
21 Call :meth:`configure` to register the RAG pipeline, strategy registries,
22 and supporting services (knowledge graph, HyDE, compression, reasoning)
23 for injection.
25 Usage::
27 from lexigram.ai.rag.config import RAGConfig
29 @module(
30 imports=[
31 RAGModule.configure(RAGConfig(chunk_size=512))
32 ]
33 )
34 class AppModule(Module):
35 pass
37 Error Handling::
39 RAG pipeline failures surface as typed exceptions that can be caught
40 directly or handled via the Result pattern::
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 )
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 """
60 @classmethod
61 def configure(cls, config: RAGConfig | None = None) -> DynamicModule:
62 """Create a RAGModule with explicit configuration.
64 Args:
65 config: :class:`~lexigram.ai.rag.config.RAGConfig` or ``None``
66 to use defaults (reads from environment variables).
68 Returns:
69 A :class:`~lexigram.di.module.DynamicModule` descriptor.
70 """
71 from lexigram.ai.rag.di.provider import RAGProvider
73 return DynamicModule(
74 module=cls,
75 providers=[RAGProvider(config=config)],
76 exports=[
77 RAGPipelineProtocol,
78 RetrievalStrategyProtocol,
79 ],
80 )
82 @classmethod
83 def stub(cls, config: RAGConfig | None = None) -> DynamicModule:
84 """Create a RAGModule suitable for unit and integration testing.
86 Uses in-memory or no-op implementations with minimal side effects.
88 Args:
89 config: Optional config override. Uses safe test defaults when None.
91 Returns:
92 A :class:`~lexigram.di.module.DynamicModule` descriptor.
93 """
94 from lexigram.ai.rag.di.provider import RAGProvider
96 return DynamicModule(
97 module=cls,
98 providers=[RAGProvider(config=config)],
99 exports=[
100 RAGPipelineProtocol,
101 RetrievalStrategyProtocol,
102 ],
103 )
106__all__ = ["RAGModule"]