1"""AI Governance sub-package."""
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-governance")
10except PackageNotFoundError:
11 __version__ = "0.0.0"
12
13if TYPE_CHECKING:
14 from lexigram.ai.governance.audit import (
15 AIAuditEvent,
16 AIAuditStore,
17 AuditEventType,
18 AuditQuery,
19 AuditSummary,
20 InMemoryAuditStore,
21 )
22 from lexigram.ai.governance.config import GovernanceConfig
23 from lexigram.ai.governance.content_gate import (
24 AlwaysAllowGate,
25 CompositeGate,
26 ContentPolicyGateProtocol,
27 ContentPolicyService,
28 PolicyDecision,
29 PolicyObserverProtocol,
30 PolicyOutcome,
31 PolicyRequest,
32 )
33 from lexigram.ai.governance.di.provider import GovernanceProvider
34 from lexigram.ai.governance.exceptions import (
35 BudgetExceededError,
36 GovernanceError,
37 ModelAccessDeniedError,
38 RateLimitExceededError,
39 ResourceExhaustedError,
40 )
41 from lexigram.ai.governance.hooks import (
42 GovernanceAuditRecordedHook,
43 GovernancePersistenceWrittenHook,
44 GovernancePolicyEvaluatedHook,
45 )
46 from lexigram.ai.governance.module import GovernanceModule
47 from lexigram.ai.governance.persistence import (
48 GovernancePersistence,
49 InMemoryGovernancePersistence,
50 RedisGovernancePersistence,
51 )
52 from lexigram.ai.governance.resource.reconciliation import (
53 GaugeReconciliationCallback,
54 GaugeReconciliationWorker,
55 )
56 from lexigram.ai.governance.resource.registry import (
57 ResourceUnitRegistry,
58 )
59 from lexigram.ai.governance.resource.tracker import (
60 ResourceUnitTracker,
61 )
62 from lexigram.ai.governance.services.manager import AIGovernanceManager
63
64_LAZY_IMPORTS: dict[str, tuple[str, str]] = {
65 # --- Content Gate ---
66 "AlwaysAllowGate": (
67 "lexigram.ai.governance.content_gate",
68 "AlwaysAllowGate",
69 ),
70 "CompositeGate": (
71 "lexigram.ai.governance.content_gate",
72 "CompositeGate",
73 ),
74 "ContentPolicyGateProtocol": (
75 "lexigram.ai.governance.content_gate",
76 "ContentPolicyGateProtocol",
77 ),
78 "ContentPolicyService": (
79 "lexigram.ai.governance.content_gate",
80 "ContentPolicyService",
81 ),
82 "PolicyDecision": (
83 "lexigram.ai.governance.content_gate",
84 "PolicyDecision",
85 ),
86 "PolicyObserverProtocol": (
87 "lexigram.ai.governance.content_gate",
88 "PolicyObserverProtocol",
89 ),
90 "PolicyOutcome": (
91 "lexigram.ai.governance.content_gate",
92 "PolicyOutcome",
93 ),
94 "PolicyRequest": (
95 "lexigram.ai.governance.content_gate",
96 "PolicyRequest",
97 ),
98 # --- Audit ---
99 "AIAuditEvent": ("lexigram.ai.governance.audit", "AIAuditEvent"),
100 "AIAuditStore": ("lexigram.ai.governance.audit", "AIAuditStore"),
101 "AuditEventType": ("lexigram.ai.governance.audit", "AuditEventType"),
102 "AuditQuery": ("lexigram.ai.governance.audit", "AuditQuery"),
103 "AuditSummary": ("lexigram.ai.governance.audit", "AuditSummary"),
104 "InMemoryAuditStore": ("lexigram.ai.governance.audit", "InMemoryAuditStore"),
105 # --- Config ---
106 "GovernanceConfig": ("lexigram.ai.governance.config", "GovernanceConfig"),
107 # --- DI ---
108 "GovernanceProvider": ("lexigram.ai.governance.di.provider", "GovernanceProvider"),
109 "GovernanceModule": ("lexigram.ai.governance.module", "GovernanceModule"),
110 # --- Exceptions ---
111 "GovernanceError": ("lexigram.ai.governance.exceptions", "GovernanceError"),
112 "BudgetExceededError": ("lexigram.ai.governance.exceptions", "BudgetExceededError"),
113 "ModelAccessDeniedError": (
114 "lexigram.ai.governance.exceptions",
115 "ModelAccessDeniedError",
116 ),
117 "RateLimitExceededError": (
118 "lexigram.ai.governance.exceptions",
119 "RateLimitExceededError",
120 ),
121 # --- Hooks ---
122 "GovernanceAuditRecordedHook": (
123 "lexigram.ai.governance.hooks",
124 "GovernanceAuditRecordedHook",
125 ),
126 "GovernancePersistenceWrittenHook": (
127 "lexigram.ai.governance.hooks",
128 "GovernancePersistenceWrittenHook",
129 ),
130 "GovernancePolicyEvaluatedHook": (
131 "lexigram.ai.governance.hooks",
132 "GovernancePolicyEvaluatedHook",
133 ),
134 # --- Persistence ---
135 "GovernancePersistence": (
136 "lexigram.ai.governance.persistence",
137 "GovernancePersistence",
138 ),
139 "InMemoryGovernancePersistence": (
140 "lexigram.ai.governance.persistence",
141 "InMemoryGovernancePersistence",
142 ),
143 "RedisGovernancePersistence": (
144 "lexigram.ai.governance.persistence",
145 "RedisGovernancePersistence",
146 ),
147 # --- Resource ---
148 "ResourceExhaustedError": (
149 "lexigram.ai.governance.exceptions",
150 "ResourceExhaustedError",
151 ),
152 "ResourceUnitRegistry": (
153 "lexigram.ai.governance.resource.registry",
154 "ResourceUnitRegistry",
155 ),
156 "ResourceUnitTracker": (
157 "lexigram.ai.governance.resource.tracker",
158 "ResourceUnitTracker",
159 ),
160 "GaugeReconciliationCallback": (
161 "lexigram.ai.governance.resource.reconciliation",
162 "GaugeReconciliationCallback",
163 ),
164 "GaugeReconciliationWorker": (
165 "lexigram.ai.governance.resource.reconciliation",
166 "GaugeReconciliationWorker",
167 ),
168 # --- Services ---
169 "AIGovernanceManager": (
170 "lexigram.ai.governance.services.manager",
171 "AIGovernanceManager",
172 ),
173 # --- Protocols ---
174 "AIAuditStoreProtocol": (
175 "lexigram.ai.governance.protocols",
176 "AIAuditStoreProtocol",
177 ),
178 "AIGovernanceProtocol": (
179 "lexigram.ai.governance.protocols",
180 "AIGovernanceProtocol",
181 ),
182 "CostTrackingProtocol": (
183 "lexigram.ai.governance.protocols",
184 "CostTrackingProtocol",
185 ),
186 # --- Events ---
187 "PolicyEvaluatedEvent": ("lexigram.ai.governance.events", "PolicyEvaluatedEvent"),
188}
189
190
191def __getattr__(name: str) -> Any:
192 """Lazy-load symbols on first access."""
193 if name in _LAZY_IMPORTS:
194 import importlib
195
196 module_path, attr_name = _LAZY_IMPORTS[name]
197 module = importlib.import_module(module_path)
198 value = getattr(module, attr_name)
199 globals()[name] = value
200 return value
201 raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
202
203
204def __dir__() -> list[str]:
205 """Enumerate available attributes for IDE support."""
206 return sorted(set(__all__) | set(_LAZY_IMPORTS.keys()))
207
208
209__all__ = [
210 "AIAuditEvent",
211 "AIAuditStore",
212 "AIAuditStoreProtocol",
213 "AIGovernanceManager",
214 "AIGovernanceProtocol",
215 "AlwaysAllowGate",
216 "AuditEventType",
217 "AuditQuery",
218 "AuditSummary",
219 "BudgetExceededError",
220 "CompositeGate",
221 "ContentPolicyGateProtocol",
222 "ContentPolicyService",
223 "CostTrackingProtocol",
224 "GaugeReconciliationCallback",
225 "GaugeReconciliationWorker",
226 "GovernanceAuditRecordedHook",
227 "GovernanceConfig",
228 "GovernanceError",
229 "GovernanceModule",
230 "GovernancePersistence",
231 "GovernancePersistenceWrittenHook",
232 "GovernancePolicyEvaluatedHook",
233 "GovernanceProvider",
234 "InMemoryAuditStore",
235 "InMemoryGovernancePersistence",
236 "ModelAccessDeniedError",
237 "PolicyDecision",
238 "PolicyEvaluatedEvent",
239 "PolicyObserverProtocol",
240 "PolicyOutcome",
241 "PolicyRequest",
242 "RateLimitExceededError",
243 "RedisGovernancePersistence",
244 "ResourceExhaustedError",
245 "ResourceUnitRegistry",
246 "ResourceUnitTracker",
247]