Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-feedback/src/lexigram/ai/feedback/__init__.py: 65%

20 statements  

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

1"""Feedback loop module for continuous learning.""" 

2 

3from __future__ import annotations 

4 

5from importlib.metadata import PackageNotFoundError, version 

6from typing import TYPE_CHECKING, Any 

7 

8try: 

9 __version__ = version("lexigram-ai-safety") 

10except PackageNotFoundError: 

11 __version__ = "0.0.0" 

12 

13if TYPE_CHECKING: 

14 from lexigram.ai.feedback.config import FeedbackConfig 

15 from lexigram.ai.feedback.di.provider import FeedbackProvider 

16 from lexigram.ai.feedback.exceptions import ( 

17 FeedbackAuthorizationError, 

18 FeedbackError, 

19 FeedbackProcessingError, 

20 FeedbackTooLargeError, 

21 FeedbackValidationError, 

22 ) 

23 from lexigram.ai.feedback.hooks import ( 

24 FeedbackProcessedHook, 

25 FeedbackStoredHook, 

26 FeedbackSubmittedHook, 

27 ) 

28 from lexigram.ai.feedback.middleware import ( 

29 FeedbackContext, 

30 FeedbackMiddleware, 

31 ) 

32 from lexigram.ai.feedback.module import FeedbackModule 

33 from lexigram.ai.feedback.services.collector import FeedbackCollector 

34 from lexigram.ai.feedback.services.feedback_service import FeedbackService 

35 from lexigram.ai.feedback.storage import ( 

36 CachedFeedbackStore, 

37 DatabaseFeedbackStore, 

38 FeedbackStoreProtocol, 

39 FeedbackSummary, 

40 ) 

41 from lexigram.ai.feedback.types import FeedbackItem, FeedbackType 

42 

43_LAZY_IMPORTS: dict[str, tuple[str, str]] = { 

44 # --- Config --- 

45 "FeedbackConfig": ("lexigram.ai.feedback.config", "FeedbackConfig"), 

46 # --- DI --- 

47 "FeedbackProvider": ("lexigram.ai.feedback.di.provider", "FeedbackProvider"), 

48 "FeedbackModule": ("lexigram.ai.feedback.module", "FeedbackModule"), 

49 # --- Exceptions --- 

50 "FeedbackAuthorizationError": ( 

51 "lexigram.ai.feedback.exceptions", 

52 "FeedbackAuthorizationError", 

53 ), 

54 "FeedbackError": ("lexigram.ai.feedback.exceptions", "FeedbackError"), 

55 "FeedbackProcessingError": ( 

56 "lexigram.ai.feedback.exceptions", 

57 "FeedbackProcessingError", 

58 ), 

59 "FeedbackTooLargeError": ( 

60 "lexigram.ai.feedback.exceptions", 

61 "FeedbackTooLargeError", 

62 ), 

63 "FeedbackValidationError": ( 

64 "lexigram.ai.feedback.exceptions", 

65 "FeedbackValidationError", 

66 ), 

67 # --- Hooks --- 

68 "FeedbackProcessedHook": ( 

69 "lexigram.ai.feedback.hooks", 

70 "FeedbackProcessedHook", 

71 ), 

72 "FeedbackStoredHook": ("lexigram.ai.feedback.hooks", "FeedbackStoredHook"), 

73 "FeedbackSubmittedHook": ("lexigram.ai.feedback.hooks", "FeedbackSubmittedHook"), 

74 # --- Middleware --- 

75 "FeedbackContext": ("lexigram.ai.feedback.middleware", "FeedbackContext"), 

76 "FeedbackMiddleware": ("lexigram.ai.feedback.middleware", "FeedbackMiddleware"), 

77 # --- Services --- 

78 "FeedbackCollector": ( 

79 "lexigram.ai.feedback.services.collector", 

80 "FeedbackCollector", 

81 ), 

82 "FeedbackService": ( 

83 "lexigram.ai.feedback.services.feedback_service", 

84 "FeedbackService", 

85 ), 

86 # --- Storage --- 

87 "CachedFeedbackStore": ("lexigram.ai.feedback.storage", "CachedFeedbackStore"), 

88 "DatabaseFeedbackStore": ("lexigram.ai.feedback.storage", "DatabaseFeedbackStore"), 

89 "FeedbackSummary": ("lexigram.ai.feedback.storage", "FeedbackSummary"), 

90 # --- Types --- 

91 "FeedbackItem": ("lexigram.ai.feedback.types", "FeedbackItem"), 

92 "FeedbackType": ("lexigram.ai.feedback.types", "FeedbackType"), 

93 # --- Protocols --- 

94 "FeedbackProtocol": ("lexigram.ai.feedback.protocols", "FeedbackProtocol"), 

95 "FeedbackStoreProtocol": ( 

96 "lexigram.ai.feedback.protocols", 

97 "FeedbackStoreProtocol", 

98 ), 

99 # --- Events --- 

100 "FeedbackSubmittedEvent": ("lexigram.ai.feedback.events", "FeedbackSubmittedEvent"), 

101} 

102 

103 

104def __getattr__(name: str) -> Any: 

105 """Lazy-load symbols on first access.""" 

106 if name in _LAZY_IMPORTS: 

107 import importlib 

108 

109 module_path, attr_name = _LAZY_IMPORTS[name] 

110 module = importlib.import_module(module_path) 

111 value = getattr(module, attr_name) 

112 globals()[name] = value 

113 return value 

114 raise AttributeError(f"module {__name__!r} has no attribute {name!r}") 

115 

116 

117def __dir__() -> list[str]: 

118 """Enumerate available attributes for IDE support.""" 

119 return sorted(set(__all__) | set(_LAZY_IMPORTS.keys())) 

120 

121 

122__all__ = [ 

123 "CachedFeedbackStore", 

124 "DatabaseFeedbackStore", 

125 "FeedbackAuthorizationError", 

126 "FeedbackCollector", 

127 "FeedbackConfig", 

128 "FeedbackContext", 

129 "FeedbackError", 

130 "FeedbackItem", 

131 "FeedbackMiddleware", 

132 "FeedbackModule", 

133 "FeedbackProcessedHook", 

134 "FeedbackProcessingError", 

135 "FeedbackProtocol", 

136 "FeedbackProvider", 

137 "FeedbackService", 

138 "FeedbackStoreProtocol", 

139 "FeedbackStoredHook", 

140 "FeedbackSubmittedEvent", 

141 "FeedbackSubmittedHook", 

142 "FeedbackSummary", 

143 "FeedbackTooLargeError", 

144 "FeedbackType", 

145 "FeedbackValidationError", 

146]