chuk-ai-session-manager 0.1.1__py3-none-any.whl → 0.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- chuk_ai_session_manager/__init__.py +336 -34
- chuk_ai_session_manager/api/__init__.py +1 -0
- chuk_ai_session_manager/api/simple_api.py +376 -0
- chuk_ai_session_manager/infinite_conversation.py +7 -4
- chuk_ai_session_manager/models/session.py +27 -18
- chuk_ai_session_manager/session_aware_tool_processor.py +6 -4
- chuk_ai_session_manager/session_prompt_builder.py +6 -4
- chuk_ai_session_manager/session_storage.py +176 -0
- chuk_ai_session_manager/utils/status_display_utils.py +474 -0
- {chuk_ai_session_manager-0.1.1.dist-info → chuk_ai_session_manager-0.2.dist-info}/METADATA +9 -8
- chuk_ai_session_manager-0.2.dist-info/RECORD +23 -0
- chuk_ai_session_manager/storage/__init__.py +0 -44
- chuk_ai_session_manager/storage/base.py +0 -50
- chuk_ai_session_manager/storage/providers/file.py +0 -348
- chuk_ai_session_manager/storage/providers/memory.py +0 -96
- chuk_ai_session_manager/storage/providers/redis.py +0 -295
- chuk_ai_session_manager-0.1.1.dist-info/RECORD +0 -24
- /chuk_ai_session_manager/{storage/providers → utils}/__init__.py +0 -0
- {chuk_ai_session_manager-0.1.1.dist-info → chuk_ai_session_manager-0.2.dist-info}/WHEEL +0 -0
- {chuk_ai_session_manager-0.1.1.dist-info → chuk_ai_session_manager-0.2.dist-info}/top_level.txt +0 -0
|
@@ -1,57 +1,359 @@
|
|
|
1
1
|
# chuk_ai_session_manager/__init__.py
|
|
2
2
|
"""
|
|
3
|
-
|
|
3
|
+
chuk_ai_session_manager - AI Session Management with CHUK Sessions Backend
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A comprehensive session management system for AI conversations with support for:
|
|
6
|
+
- Hierarchical session organization with parent-child relationships
|
|
7
|
+
- Token usage tracking and cost estimation
|
|
8
|
+
- Tool execution logging and result caching
|
|
9
|
+
- Async-first design with proper error handling
|
|
10
|
+
- Multiple prompt building strategies for different use cases
|
|
11
|
+
- Infinite conversation support with automatic summarization
|
|
12
|
+
- Simple developer API for easy integration
|
|
13
|
+
|
|
14
|
+
Basic Usage:
|
|
15
|
+
from chuk_ai_session_manager import SessionManager, Session, EventSource
|
|
16
|
+
|
|
17
|
+
# Simple API
|
|
18
|
+
sm = SessionManager()
|
|
19
|
+
await sm.user_says("Hello!")
|
|
20
|
+
await sm.ai_responds("Hi there!", model="gpt-4")
|
|
21
|
+
|
|
22
|
+
# Advanced API
|
|
23
|
+
session = await Session.create()
|
|
24
|
+
event = await SessionEvent.create_with_tokens(
|
|
25
|
+
message="Hello world",
|
|
26
|
+
prompt="Hello world",
|
|
27
|
+
model="gpt-4",
|
|
28
|
+
source=EventSource.USER
|
|
29
|
+
)
|
|
30
|
+
await session.add_event_and_save(event)
|
|
6
31
|
"""
|
|
7
|
-
|
|
32
|
+
|
|
33
|
+
__version__ = "0.1.0"
|
|
34
|
+
|
|
35
|
+
# Import order is important to avoid circular dependencies
|
|
36
|
+
_imported_modules = {}
|
|
37
|
+
|
|
38
|
+
# Core enums (no dependencies)
|
|
8
39
|
try:
|
|
9
40
|
from chuk_ai_session_manager.models.event_source import EventSource
|
|
10
41
|
from chuk_ai_session_manager.models.event_type import EventType
|
|
11
|
-
|
|
12
|
-
|
|
42
|
+
_imported_modules['enums'] = True
|
|
43
|
+
except ImportError as e:
|
|
44
|
+
_imported_modules['enums'] = f"Import error: {e}"
|
|
45
|
+
EventSource = None
|
|
46
|
+
EventType = None
|
|
47
|
+
|
|
48
|
+
# Token usage (minimal dependencies)
|
|
49
|
+
try:
|
|
50
|
+
from chuk_ai_session_manager.models.token_usage import TokenUsage, TokenSummary
|
|
51
|
+
_imported_modules['token_usage'] = True
|
|
52
|
+
except ImportError as e:
|
|
53
|
+
_imported_modules['token_usage'] = f"Import error: {e}"
|
|
54
|
+
TokenUsage = None
|
|
55
|
+
TokenSummary = None
|
|
56
|
+
|
|
57
|
+
# Session metadata (depends on nothing)
|
|
58
|
+
try:
|
|
13
59
|
from chuk_ai_session_manager.models.session_metadata import SessionMetadata
|
|
60
|
+
_imported_modules['session_metadata'] = True
|
|
61
|
+
except ImportError as e:
|
|
62
|
+
_imported_modules['session_metadata'] = f"Import error: {e}"
|
|
63
|
+
SessionMetadata = None
|
|
64
|
+
|
|
65
|
+
# Session run (minimal dependencies)
|
|
66
|
+
try:
|
|
14
67
|
from chuk_ai_session_manager.models.session_run import SessionRun, RunStatus
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
68
|
+
_imported_modules['session_run'] = True
|
|
69
|
+
except ImportError as e:
|
|
70
|
+
_imported_modules['session_run'] = f"Import error: {e}"
|
|
71
|
+
SessionRun = None
|
|
72
|
+
RunStatus = None
|
|
73
|
+
|
|
74
|
+
# Session event (depends on enums and token usage)
|
|
75
|
+
try:
|
|
76
|
+
from chuk_ai_session_manager.models.session_event import SessionEvent
|
|
77
|
+
_imported_modules['session_event'] = True
|
|
78
|
+
except ImportError as e:
|
|
79
|
+
_imported_modules['session_event'] = f"Import error: {e}"
|
|
80
|
+
SessionEvent = None
|
|
18
81
|
|
|
19
|
-
#
|
|
82
|
+
# Session (depends on most other models)
|
|
20
83
|
try:
|
|
21
|
-
from chuk_ai_session_manager.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
84
|
+
from chuk_ai_session_manager.models.session import Session
|
|
85
|
+
_imported_modules['session'] = True
|
|
86
|
+
except ImportError as e:
|
|
87
|
+
_imported_modules['session'] = f"Import error: {e}"
|
|
88
|
+
Session = None
|
|
25
89
|
|
|
26
|
-
#
|
|
90
|
+
# Storage backend
|
|
91
|
+
try:
|
|
92
|
+
from chuk_ai_session_manager.session_storage import (
|
|
93
|
+
SessionStorage,
|
|
94
|
+
get_backend,
|
|
95
|
+
setup_chuk_sessions_storage,
|
|
96
|
+
ChukSessionsStore
|
|
97
|
+
)
|
|
98
|
+
from chuk_sessions import SessionManager as ChukSessionManager
|
|
99
|
+
_imported_modules['storage'] = True
|
|
100
|
+
|
|
101
|
+
# Create a compatibility alias for tests that expect chuk_sessions_storage
|
|
102
|
+
import types
|
|
103
|
+
chuk_sessions_storage = types.ModuleType('chuk_sessions_storage')
|
|
104
|
+
chuk_sessions_storage.SessionStorage = SessionStorage
|
|
105
|
+
chuk_sessions_storage.get_backend = get_backend
|
|
106
|
+
chuk_sessions_storage.setup_chuk_sessions_storage = setup_chuk_sessions_storage
|
|
107
|
+
chuk_sessions_storage.ChukSessionsStore = ChukSessionsStore
|
|
108
|
+
chuk_sessions_storage.ChukSessionManager = ChukSessionManager
|
|
109
|
+
|
|
110
|
+
except ImportError as e:
|
|
111
|
+
_imported_modules['storage'] = f"Import error: {e}"
|
|
112
|
+
SessionStorage = None
|
|
113
|
+
get_backend = None
|
|
114
|
+
setup_chuk_sessions_storage = None
|
|
115
|
+
ChukSessionsStore = None
|
|
116
|
+
chuk_sessions_storage = None
|
|
117
|
+
ChukSessionManager = None
|
|
118
|
+
|
|
119
|
+
# Exceptions
|
|
27
120
|
try:
|
|
28
121
|
from chuk_ai_session_manager.exceptions import (
|
|
29
122
|
SessionManagerError,
|
|
30
123
|
SessionNotFound,
|
|
31
124
|
SessionAlreadyExists,
|
|
32
125
|
InvalidSessionOperation,
|
|
126
|
+
TokenLimitExceeded,
|
|
127
|
+
StorageError,
|
|
128
|
+
ToolProcessingError
|
|
33
129
|
)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
130
|
+
_imported_modules['exceptions'] = True
|
|
131
|
+
except ImportError as e:
|
|
132
|
+
_imported_modules['exceptions'] = f"Import error: {e}"
|
|
133
|
+
SessionManagerError = None
|
|
134
|
+
SessionNotFound = None
|
|
135
|
+
SessionAlreadyExists = None
|
|
136
|
+
InvalidSessionOperation = None
|
|
137
|
+
TokenLimitExceeded = None
|
|
138
|
+
StorageError = None
|
|
139
|
+
ToolProcessingError = None
|
|
37
140
|
|
|
38
|
-
|
|
141
|
+
# Prompt building
|
|
142
|
+
try:
|
|
143
|
+
from chuk_ai_session_manager.session_prompt_builder import (
|
|
144
|
+
PromptStrategy,
|
|
145
|
+
build_prompt_from_session,
|
|
146
|
+
truncate_prompt_to_token_limit
|
|
147
|
+
)
|
|
148
|
+
_imported_modules['prompt_builder'] = True
|
|
149
|
+
except ImportError as e:
|
|
150
|
+
_imported_modules['prompt_builder'] = f"Import error: {e}"
|
|
151
|
+
PromptStrategy = None
|
|
152
|
+
build_prompt_from_session = None
|
|
153
|
+
truncate_prompt_to_token_limit = None
|
|
154
|
+
|
|
155
|
+
# Tool processing
|
|
156
|
+
try:
|
|
157
|
+
from chuk_ai_session_manager.session_aware_tool_processor import SessionAwareToolProcessor
|
|
158
|
+
_imported_modules['tool_processor'] = True
|
|
159
|
+
except ImportError as e:
|
|
160
|
+
_imported_modules['tool_processor'] = f"Import error: {e}"
|
|
161
|
+
SessionAwareToolProcessor = None
|
|
39
162
|
|
|
40
|
-
#
|
|
163
|
+
# Infinite conversation management
|
|
164
|
+
try:
|
|
165
|
+
from chuk_ai_session_manager.infinite_conversation import (
|
|
166
|
+
InfiniteConversationManager,
|
|
167
|
+
SummarizationStrategy
|
|
168
|
+
)
|
|
169
|
+
_imported_modules['infinite_conversation'] = True
|
|
170
|
+
except ImportError as e:
|
|
171
|
+
_imported_modules['infinite_conversation'] = f"Import error: {e}"
|
|
172
|
+
InfiniteConversationManager = None
|
|
173
|
+
SummarizationStrategy = None
|
|
174
|
+
|
|
175
|
+
# Simple API (depends on most other components)
|
|
176
|
+
try:
|
|
177
|
+
from chuk_ai_session_manager.simple_api import (
|
|
178
|
+
SessionManager,
|
|
179
|
+
quick_conversation,
|
|
180
|
+
track_llm_call
|
|
181
|
+
)
|
|
182
|
+
_imported_modules['simple_api'] = True
|
|
183
|
+
except ImportError as e:
|
|
184
|
+
_imported_modules['simple_api'] = f"Import error: {e}"
|
|
185
|
+
SessionManager = None
|
|
186
|
+
quick_conversation = None
|
|
187
|
+
track_llm_call = None
|
|
188
|
+
|
|
189
|
+
# Build __all__ list from successfully imported components
|
|
41
190
|
__all__ = []
|
|
42
191
|
|
|
43
|
-
#
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
'
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
'
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
192
|
+
# Core models
|
|
193
|
+
if EventSource is not None:
|
|
194
|
+
__all__.extend(['EventSource', 'EventType'])
|
|
195
|
+
if TokenUsage is not None:
|
|
196
|
+
__all__.extend(['TokenUsage', 'TokenSummary'])
|
|
197
|
+
if SessionMetadata is not None:
|
|
198
|
+
__all__.append('SessionMetadata')
|
|
199
|
+
if SessionRun is not None:
|
|
200
|
+
__all__.extend(['SessionRun', 'RunStatus'])
|
|
201
|
+
if SessionEvent is not None:
|
|
202
|
+
__all__.append('SessionEvent')
|
|
203
|
+
if Session is not None:
|
|
204
|
+
__all__.append('Session')
|
|
205
|
+
|
|
206
|
+
# Storage
|
|
207
|
+
if SessionStorage is not None:
|
|
208
|
+
__all__.extend([
|
|
209
|
+
'SessionStorage',
|
|
210
|
+
'get_backend',
|
|
211
|
+
'setup_chuk_sessions_storage',
|
|
212
|
+
'ChukSessionsStore',
|
|
213
|
+
'ChukSessionManager',
|
|
214
|
+
'chuk_sessions_storage' # Add the compatibility alias
|
|
215
|
+
])
|
|
216
|
+
|
|
217
|
+
# Exceptions
|
|
218
|
+
if SessionManagerError is not None:
|
|
219
|
+
__all__.extend([
|
|
220
|
+
'SessionManagerError',
|
|
221
|
+
'SessionNotFound',
|
|
222
|
+
'SessionAlreadyExists',
|
|
223
|
+
'InvalidSessionOperation',
|
|
224
|
+
'TokenLimitExceeded',
|
|
225
|
+
'StorageError',
|
|
226
|
+
'ToolProcessingError'
|
|
227
|
+
])
|
|
228
|
+
|
|
229
|
+
# Advanced features
|
|
230
|
+
if PromptStrategy is not None:
|
|
231
|
+
__all__.extend([
|
|
232
|
+
'PromptStrategy',
|
|
233
|
+
'build_prompt_from_session',
|
|
234
|
+
'truncate_prompt_to_token_limit'
|
|
235
|
+
])
|
|
236
|
+
|
|
237
|
+
if SessionAwareToolProcessor is not None:
|
|
238
|
+
__all__.append('SessionAwareToolProcessor')
|
|
239
|
+
|
|
240
|
+
if InfiniteConversationManager is not None:
|
|
241
|
+
__all__.extend(['InfiniteConversationManager', 'SummarizationStrategy'])
|
|
242
|
+
|
|
243
|
+
# Simple API
|
|
244
|
+
if SessionManager is not None:
|
|
245
|
+
__all__.extend(['SessionManager', 'quick_conversation', 'track_llm_call'])
|
|
246
|
+
|
|
247
|
+
def get_import_status():
|
|
248
|
+
"""
|
|
249
|
+
Get the import status of all modules.
|
|
250
|
+
|
|
251
|
+
Returns:
|
|
252
|
+
Dict[str, Union[bool, str]]: Module import status
|
|
253
|
+
"""
|
|
254
|
+
return _imported_modules.copy()
|
|
255
|
+
|
|
256
|
+
def check_dependencies():
|
|
257
|
+
"""
|
|
258
|
+
Check which optional dependencies are available.
|
|
259
|
+
|
|
260
|
+
Returns:
|
|
261
|
+
Dict[str, bool]: Availability of optional dependencies
|
|
262
|
+
"""
|
|
263
|
+
deps = {}
|
|
264
|
+
|
|
265
|
+
# Check tiktoken for accurate token counting
|
|
266
|
+
try:
|
|
267
|
+
import tiktoken
|
|
268
|
+
deps['tiktoken'] = True
|
|
269
|
+
except ImportError:
|
|
270
|
+
deps['tiktoken'] = False
|
|
271
|
+
|
|
272
|
+
# Check chuk_sessions
|
|
273
|
+
try:
|
|
274
|
+
import chuk_sessions
|
|
275
|
+
deps['chuk_sessions'] = True
|
|
276
|
+
except ImportError:
|
|
277
|
+
deps['chuk_sessions'] = False
|
|
278
|
+
|
|
279
|
+
# Check chuk_tool_processor
|
|
280
|
+
try:
|
|
281
|
+
import chuk_tool_processor
|
|
282
|
+
deps['chuk_tool_processor'] = True
|
|
283
|
+
except ImportError:
|
|
284
|
+
deps['chuk_tool_processor'] = False
|
|
285
|
+
|
|
286
|
+
return deps
|
|
287
|
+
|
|
288
|
+
# Convenience function to check if package is properly set up
|
|
289
|
+
def verify_installation():
|
|
290
|
+
"""
|
|
291
|
+
Verify that the package is properly installed and configured.
|
|
292
|
+
|
|
293
|
+
Returns:
|
|
294
|
+
Tuple[bool, List[str]]: (is_valid, list_of_issues)
|
|
295
|
+
"""
|
|
296
|
+
issues = []
|
|
297
|
+
|
|
298
|
+
# Check core components
|
|
299
|
+
if Session is None:
|
|
300
|
+
issues.append("Core Session model failed to import")
|
|
301
|
+
if SessionEvent is None:
|
|
302
|
+
issues.append("SessionEvent model failed to import")
|
|
303
|
+
if SessionManager is None:
|
|
304
|
+
issues.append("Simple API (SessionManager) failed to import")
|
|
305
|
+
|
|
306
|
+
# Check dependencies
|
|
307
|
+
deps = check_dependencies()
|
|
308
|
+
if not deps.get('chuk_sessions', False):
|
|
309
|
+
issues.append("chuk_sessions dependency not available - storage backend will not work")
|
|
310
|
+
|
|
311
|
+
is_valid = len(issues) == 0
|
|
312
|
+
return is_valid, issues
|
|
313
|
+
|
|
314
|
+
# Initialize storage backend if available
|
|
315
|
+
def setup_storage(sandbox_id: str = "ai-session-manager", default_ttl_hours: int = 24):
|
|
316
|
+
"""
|
|
317
|
+
Set up the CHUK Sessions storage backend.
|
|
318
|
+
|
|
319
|
+
Args:
|
|
320
|
+
sandbox_id: Sandbox ID for CHUK Sessions
|
|
321
|
+
default_ttl_hours: Default TTL for sessions in hours
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
SessionStorage instance or None if setup failed
|
|
325
|
+
"""
|
|
326
|
+
if setup_chuk_sessions_storage is not None:
|
|
327
|
+
try:
|
|
328
|
+
return setup_chuk_sessions_storage(
|
|
329
|
+
sandbox_id=sandbox_id,
|
|
330
|
+
default_ttl_hours=default_ttl_hours
|
|
331
|
+
)
|
|
332
|
+
except Exception as e:
|
|
333
|
+
import warnings
|
|
334
|
+
warnings.warn(f"Failed to set up CHUK Sessions storage: {e}")
|
|
335
|
+
return None
|
|
336
|
+
else:
|
|
337
|
+
import warnings
|
|
338
|
+
warnings.warn("CHUK Sessions storage not available - imports failed")
|
|
339
|
+
return None
|
|
340
|
+
|
|
341
|
+
# Version info
|
|
342
|
+
__author__ = "CHUK AI Session Manager Team"
|
|
343
|
+
__email__ = "support@chuk.ai"
|
|
344
|
+
__license__ = "MIT"
|
|
345
|
+
__description__ = "AI Session Management with CHUK Sessions Backend"
|
|
346
|
+
|
|
347
|
+
# Package metadata
|
|
348
|
+
__package_info__ = {
|
|
349
|
+
"name": "chuk_ai_session_manager",
|
|
350
|
+
"version": __version__,
|
|
351
|
+
"description": __description__,
|
|
352
|
+
"author": __author__,
|
|
353
|
+
"license": __license__,
|
|
354
|
+
"dependencies": {
|
|
355
|
+
"required": ["pydantic", "uuid", "datetime", "asyncio"],
|
|
356
|
+
"optional": ["tiktoken", "chuk_sessions", "chuk_tool_processor"]
|
|
357
|
+
},
|
|
358
|
+
"import_status": _imported_modules
|
|
359
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# chuk_ai_session_manager/api/__init__.py
|