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

15 statements  

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

1"""Prompt module for Lexigram.""" 

2 

3from __future__ import annotations 

4 

5from typing import TYPE_CHECKING, Any 

6 

7from lexigram.contracts.ai.llm import PromptTemplateProtocol 

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

9 

10if TYPE_CHECKING: 

11 from lexigram.ai.prompt.config import PromptConfig 

12 

13 

14@module() 

15class PromptModule(Module): 

16 """Prompt template management and rendering integration. 

17 

18 Registers the :class:`~lexigram.ai.prompt.di.provider.PromptProvider` 

19 which wires a :class:`~lexigram.ai.prompt.registry.registry.PromptRegistry` 

20 into the container and exposes it as 

21 :class:`~lexigram.contracts.ai.llm.PromptTemplateProtocol`. 

22 

23 Usage:: 

24 

25 from lexigram.ai.prompt import PromptModule 

26 from lexigram.ai.prompt.config import PromptConfig 

27 

28 @module( 

29 imports=[ 

30 PromptModule.configure( 

31 PromptConfig(default_format="jinja2") 

32 ) 

33 ] 

34 ) 

35 class AppModule(Module): 

36 pass 

37 

38 Error Handling:: 

39 

40 Prompt rendering and registry lookups surface typed exceptions that 

41 can be caught directly or handled via the Result pattern:: 

42 

43 from lexigram.ai.prompt.exceptions import ( 

44 PromptError, # base — catch-all 

45 PromptRenderError, # template rendering failure 

46 PromptValidationError,# variable type / value validation 

47 PromptNotFoundError, # named template not in registry 

48 PromptVersionError, # version conflict or invalid rollback 

49 ) 

50 

51 Exports: 

52 :class:`~lexigram.contracts.ai.llm.PromptTemplateProtocol`, 

53 :class:`~lexigram.ai.prompt.exceptions.PromptError`, 

54 :class:`~lexigram.ai.prompt.exceptions.PromptRenderError`, 

55 :class:`~lexigram.ai.prompt.exceptions.PromptValidationError`, 

56 :class:`~lexigram.ai.prompt.exceptions.PromptNotFoundError`, 

57 :class:`~lexigram.ai.prompt.exceptions.PromptVersionError` 

58 """ 

59 

60 @classmethod 

61 def configure( 

62 cls, config: PromptConfig | None = None, **kwargs: Any 

63 ) -> DynamicModule: 

64 """Create a PromptModule with explicit configuration. 

65 

66 Args: 

67 config: :class:`~lexigram.ai.prompt.config.PromptConfig` or ``None`` 

68 to use defaults. 

69 **kwargs: Additional keyword arguments forwarded to 

70 :class:`~lexigram.ai.prompt.di.provider.PromptProvider`. 

71 

72 Returns: 

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

74 """ 

75 from lexigram.ai.prompt.di.provider import PromptProvider 

76 

77 return DynamicModule( 

78 module=cls, 

79 providers=[PromptProvider(config=config, **kwargs)], 

80 exports=[ 

81 PromptTemplateProtocol, 

82 ], 

83 ) 

84 

85 @classmethod 

86 def stub(cls, config: PromptConfig | None = None) -> DynamicModule: 

87 """Create a PromptModule suitable for unit and integration testing. 

88 

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

90 

91 Args: 

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

93 

94 Returns: 

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

96 """ 

97 from lexigram.ai.prompt.di.provider import PromptProvider 

98 

99 return DynamicModule( 

100 module=cls, 

101 providers=[PromptProvider(config=config)], 

102 exports=[ 

103 PromptTemplateProtocol, 

104 ], 

105 ) 

106 

107 

108__all__ = ["PromptModule"]