Coverage for /home/admin/Documents/AI/applications/lexigram-dev/lexigram/experimental/ai/lexigram-ai-session/src/lexigram/ai/session/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"""Session module for dependency injection."""
3from __future__ import annotations
5from typing import TYPE_CHECKING
7from lexigram.contracts.ai.session import SessionManagerProtocol, SessionStoreProtocol
8from lexigram.di.module import DynamicModule, Module, module
10if TYPE_CHECKING:
11 from lexigram.ai.session.config import SessionConfig
14@module()
15class SessionModule(Module):
16 """AI conversation session management integration.
18 Call :meth:`configure` to register
19 :class:`~lexigram.contracts.ai.session.SessionStoreProtocol` and
20 :class:`~lexigram.contracts.ai.session.SessionManagerProtocol`
21 implementations for injection.
23 Usage::
25 from lexigram.ai.session.config import SessionConfig
27 @module(
28 imports=[
29 SessionModule.configure(
30 SessionConfig(backend="cache"),
31 enable_cleanup_scheduler=True,
32 )
33 ]
34 )
35 class AppModule(Module):
36 pass
38 Error Handling::
40 Session operations surface typed exceptions that can be caught
41 directly or handled via the Result pattern::
43 from lexigram.ai.session.exceptions import (
44 SessionError, # base — catch-all
45 SessionNotFoundError, # session ID not in store
46 SessionClosedError, # write on a closed session
47 SessionExpiredError, # TTL exceeded
48 CheckpointNotFoundError,# checkpoint ID not found
49 )
51 Exports:
52 :class:`~lexigram.contracts.ai.session.SessionStoreProtocol`,
53 :class:`~lexigram.contracts.ai.session.SessionManagerProtocol`,
54 :class:`~lexigram.ai.session.exceptions.SessionError`,
55 :class:`~lexigram.ai.session.exceptions.SessionNotFoundError`,
56 :class:`~lexigram.ai.session.exceptions.SessionClosedError`,
57 :class:`~lexigram.ai.session.exceptions.SessionExpiredError`,
58 :class:`~lexigram.ai.session.exceptions.CheckpointNotFoundError`
59 """
61 @classmethod
62 def configure(
63 cls,
64 config: SessionConfig | None = None,
65 *,
66 enable_cleanup_scheduler: bool = True,
67 ) -> DynamicModule:
68 """Create a SessionModule with the given configuration.
70 Args:
71 config: :class:`~lexigram.ai.session.config.SessionConfig`, a
72 plain ``dict`` of the same keys, or ``None`` to use defaults.
73 enable_cleanup_scheduler: Start the background expired-session
74 cleanup loop during boot. Defaults to ``True``.
76 Returns:
77 A :class:`~lexigram.di.module.DynamicModule` descriptor.
78 """
79 from lexigram.ai.session.di.provider import SessionProvider
81 return DynamicModule(
82 module=cls,
83 providers=[
84 SessionProvider(
85 config=config,
86 enable_cleanup_scheduler=enable_cleanup_scheduler,
87 )
88 ],
89 exports=[
90 SessionStoreProtocol,
91 SessionManagerProtocol,
92 ],
93 )
95 @classmethod
96 def stub(cls, config: SessionConfig | None = None) -> DynamicModule:
97 """Create a SessionModule suitable for unit and integration testing.
99 Uses in-memory store with the cleanup scheduler disabled to avoid
100 background tasks during tests.
102 Args:
103 config: Optional config override. Uses safe test defaults when None.
105 Returns:
106 A :class:`~lexigram.di.module.DynamicModule` descriptor.
107 """
108 from lexigram.ai.session.di.provider import SessionProvider
110 return DynamicModule(
111 module=cls,
112 providers=[
113 SessionProvider(
114 config=config,
115 enable_cleanup_scheduler=False,
116 )
117 ],
118 exports=[
119 SessionStoreProtocol,
120 SessionManagerProtocol,
121 ],
122 )
125__all__ = ["SessionModule"]