chuk-ai-session-manager 0.3__py3-none-any.whl → 0.4.1__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 +307 -49
- chuk_ai_session_manager/api/simple_api.py +276 -425
- chuk_ai_session_manager/models/session.py +11 -4
- chuk_ai_session_manager/models/session_event.py +185 -81
- chuk_ai_session_manager/models/token_usage.py +13 -2
- chuk_ai_session_manager/sample_tools.py +1 -1
- chuk_ai_session_manager/session_manager.py +760 -0
- chuk_ai_session_manager/session_prompt_builder.py +70 -62
- chuk_ai_session_manager/session_storage.py +19 -6
- {chuk_ai_session_manager-0.3.dist-info → chuk_ai_session_manager-0.4.1.dist-info}/METADATA +2 -38
- chuk_ai_session_manager-0.4.1.dist-info/RECORD +22 -0
- chuk_ai_session_manager/utils/__init__.py +0 -0
- chuk_ai_session_manager/utils/status_display_utils.py +0 -474
- chuk_ai_session_manager-0.3.dist-info/RECORD +0 -23
- {chuk_ai_session_manager-0.3.dist-info → chuk_ai_session_manager-0.4.1.dist-info}/WHEEL +0 -0
- {chuk_ai_session_manager-0.3.dist-info → chuk_ai_session_manager-0.4.1.dist-info}/top_level.txt +0 -0
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
# chuk_ai_session_manager/__init__.py
|
|
1
|
+
# src/chuk_ai_session_manager/__init__.py
|
|
2
2
|
"""
|
|
3
3
|
CHUK AI Session Manager - Simple Developer API
|
|
4
4
|
|
|
5
|
+
A powerful session management system for AI applications that provides:
|
|
6
|
+
- Automatic conversation tracking
|
|
7
|
+
- Token usage monitoring
|
|
8
|
+
- Tool call logging
|
|
9
|
+
- Infinite context support with automatic summarization
|
|
10
|
+
- Hierarchical session relationships
|
|
11
|
+
- CHUK Sessions backend integration
|
|
12
|
+
|
|
5
13
|
Quick Start:
|
|
6
14
|
from chuk_ai_session_manager import track_conversation
|
|
7
15
|
|
|
@@ -13,59 +21,309 @@ Quick Start:
|
|
|
13
21
|
sm = SessionManager()
|
|
14
22
|
await sm.user_says("What's the weather?")
|
|
15
23
|
await sm.ai_responds("It's sunny and 72°F", model="gpt-4")
|
|
16
|
-
"""
|
|
17
24
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
SessionManager,
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
from chuk_ai_session_manager.models.session import Session
|
|
29
|
-
from chuk_ai_session_manager.models.session_event import SessionEvent
|
|
30
|
-
from chuk_ai_session_manager.models.event_source import EventSource
|
|
31
|
-
from chuk_ai_session_manager.models.event_type import EventType
|
|
32
|
-
|
|
33
|
-
# Storage backend setup
|
|
34
|
-
from chuk_ai_session_manager.session_storage import setup_chuk_sessions_storage
|
|
35
|
-
|
|
36
|
-
__version__ = "0.1.0"
|
|
37
|
-
|
|
38
|
-
# Main exports - keep it simple
|
|
39
|
-
__all__ = [
|
|
40
|
-
# Simple API - most developers start here
|
|
41
|
-
"SessionManager",
|
|
42
|
-
"track_conversation",
|
|
43
|
-
"track_llm_call",
|
|
44
|
-
"quick_conversation",
|
|
45
|
-
"track_infinite_conversation",
|
|
25
|
+
Infinite Context Example:
|
|
26
|
+
# Automatically handles long conversations with summarization
|
|
27
|
+
sm = SessionManager(infinite_context=True, token_threshold=4000)
|
|
28
|
+
await sm.user_says("Tell me about machine learning")
|
|
29
|
+
await sm.ai_responds("Machine learning is...", model="gpt-4")
|
|
30
|
+
# Session will auto-segment when limits are reached
|
|
31
|
+
|
|
32
|
+
Advanced Usage:
|
|
33
|
+
# Access the full Session model for detailed control
|
|
34
|
+
from chuk_ai_session_manager import Session, SessionEvent
|
|
46
35
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
36
|
+
session = await Session.create()
|
|
37
|
+
event = await SessionEvent.create_with_tokens(
|
|
38
|
+
message="Hello", prompt="Hello", model="gpt-4"
|
|
39
|
+
)
|
|
40
|
+
await session.add_event_and_save(event)
|
|
41
|
+
"""
|
|
42
|
+
|
|
43
|
+
import logging
|
|
44
|
+
from typing import Optional
|
|
45
|
+
|
|
46
|
+
# Package version
|
|
47
|
+
__version__ = "0.4"
|
|
48
|
+
|
|
49
|
+
# Set up package-level logger
|
|
50
|
+
logger = logging.getLogger(__name__)
|
|
51
|
+
|
|
52
|
+
# Core enums and constants (no dependencies)
|
|
53
|
+
try:
|
|
54
|
+
from chuk_ai_session_manager.models.event_source import EventSource
|
|
55
|
+
from chuk_ai_session_manager.models.event_type import EventType
|
|
56
|
+
except ImportError as e:
|
|
57
|
+
logger.warning(f"Could not import core enums: {e}")
|
|
58
|
+
EventSource = None
|
|
59
|
+
EventType = None
|
|
60
|
+
|
|
61
|
+
# Storage setup function (no circular dependencies)
|
|
62
|
+
try:
|
|
63
|
+
from chuk_ai_session_manager.session_storage import setup_chuk_sessions_storage
|
|
64
|
+
except ImportError as e:
|
|
65
|
+
logger.warning(f"Could not import storage setup: {e}")
|
|
66
|
+
setup_chuk_sessions_storage = None
|
|
67
|
+
|
|
68
|
+
# Exception classes
|
|
69
|
+
try:
|
|
70
|
+
from chuk_ai_session_manager.exceptions import (
|
|
71
|
+
SessionManagerError,
|
|
72
|
+
SessionNotFound,
|
|
73
|
+
SessionAlreadyExists,
|
|
74
|
+
InvalidSessionOperation,
|
|
75
|
+
TokenLimitExceeded,
|
|
76
|
+
StorageError,
|
|
77
|
+
ToolProcessingError
|
|
78
|
+
)
|
|
79
|
+
except ImportError as e:
|
|
80
|
+
logger.warning(f"Could not import exceptions: {e}")
|
|
81
|
+
# Define minimal fallback exceptions
|
|
82
|
+
class SessionManagerError(Exception):
|
|
83
|
+
"""Base exception for session manager errors."""
|
|
84
|
+
pass
|
|
52
85
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
86
|
+
SessionNotFound = SessionManagerError
|
|
87
|
+
SessionAlreadyExists = SessionManagerError
|
|
88
|
+
InvalidSessionOperation = SessionManagerError
|
|
89
|
+
TokenLimitExceeded = SessionManagerError
|
|
90
|
+
StorageError = SessionManagerError
|
|
91
|
+
ToolProcessingError = SessionManagerError
|
|
92
|
+
|
|
93
|
+
# Core models (may have some dependencies)
|
|
94
|
+
Session = None
|
|
95
|
+
SessionEvent = None
|
|
96
|
+
SessionMetadata = None
|
|
97
|
+
SessionRun = None
|
|
98
|
+
RunStatus = None
|
|
99
|
+
TokenUsage = None
|
|
100
|
+
|
|
101
|
+
try:
|
|
102
|
+
from chuk_ai_session_manager.models.session_metadata import SessionMetadata
|
|
103
|
+
except ImportError as e:
|
|
104
|
+
logger.debug(f"Could not import SessionMetadata: {e}")
|
|
105
|
+
|
|
106
|
+
try:
|
|
107
|
+
from chuk_ai_session_manager.models.session_run import SessionRun, RunStatus
|
|
108
|
+
except ImportError as e:
|
|
109
|
+
logger.debug(f"Could not import SessionRun: {e}")
|
|
110
|
+
|
|
111
|
+
try:
|
|
112
|
+
from chuk_ai_session_manager.models.token_usage import TokenUsage, TokenSummary
|
|
113
|
+
except ImportError as e:
|
|
114
|
+
logger.debug(f"Could not import TokenUsage: {e}")
|
|
115
|
+
TokenSummary = None
|
|
116
|
+
|
|
117
|
+
try:
|
|
118
|
+
from chuk_ai_session_manager.models.session_event import SessionEvent
|
|
119
|
+
except ImportError as e:
|
|
120
|
+
logger.debug(f"Could not import SessionEvent: {e}")
|
|
121
|
+
|
|
122
|
+
try:
|
|
123
|
+
from chuk_ai_session_manager.models.session import Session
|
|
124
|
+
except ImportError as e:
|
|
125
|
+
logger.debug(f"Could not import Session: {e}")
|
|
126
|
+
|
|
127
|
+
# Simple API (highest level, most dependencies)
|
|
128
|
+
SessionManager = None
|
|
129
|
+
track_conversation = None
|
|
130
|
+
track_llm_call = None
|
|
131
|
+
quick_conversation = None
|
|
132
|
+
track_infinite_conversation = None
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
from chuk_ai_session_manager.api.simple_api import (
|
|
136
|
+
SessionManager,
|
|
137
|
+
track_conversation,
|
|
138
|
+
track_llm_call,
|
|
139
|
+
quick_conversation,
|
|
140
|
+
track_infinite_conversation
|
|
141
|
+
)
|
|
142
|
+
except ImportError as e:
|
|
143
|
+
logger.warning(f"Could not import simple API: {e}")
|
|
144
|
+
|
|
145
|
+
# Advanced components (optional)
|
|
146
|
+
InfiniteConversationManager = None
|
|
147
|
+
SessionAwareToolProcessor = None
|
|
148
|
+
build_prompt_from_session = None
|
|
149
|
+
PromptStrategy = None
|
|
150
|
+
|
|
151
|
+
try:
|
|
152
|
+
from chuk_ai_session_manager.infinite_conversation import InfiniteConversationManager
|
|
153
|
+
except ImportError as e:
|
|
154
|
+
logger.debug(f"Could not import InfiniteConversationManager: {e}")
|
|
155
|
+
|
|
156
|
+
try:
|
|
157
|
+
from chuk_ai_session_manager.session_aware_tool_processor import SessionAwareToolProcessor
|
|
158
|
+
except ImportError as e:
|
|
159
|
+
logger.debug(f"Could not import SessionAwareToolProcessor: {e}")
|
|
160
|
+
|
|
161
|
+
try:
|
|
162
|
+
from chuk_ai_session_manager.session_prompt_builder import (
|
|
163
|
+
build_prompt_from_session,
|
|
164
|
+
PromptStrategy
|
|
165
|
+
)
|
|
166
|
+
except ImportError as e:
|
|
167
|
+
logger.debug(f"Could not import prompt builder: {e}")
|
|
56
168
|
|
|
57
|
-
|
|
58
|
-
def
|
|
59
|
-
|
|
169
|
+
|
|
170
|
+
def _auto_setup_storage(sandbox_id: str = "chuk-ai-session-manager",
|
|
171
|
+
default_ttl_hours: int = 24) -> bool:
|
|
172
|
+
"""
|
|
173
|
+
Auto-setup storage with sensible defaults if not already configured.
|
|
174
|
+
|
|
175
|
+
Args:
|
|
176
|
+
sandbox_id: CHUK Sessions sandbox ID to use
|
|
177
|
+
default_ttl_hours: Default TTL for sessions
|
|
178
|
+
|
|
179
|
+
Returns:
|
|
180
|
+
True if setup was successful, False otherwise
|
|
181
|
+
"""
|
|
182
|
+
if setup_chuk_sessions_storage is None:
|
|
183
|
+
logger.warning("Storage setup not available - imports failed")
|
|
184
|
+
return False
|
|
185
|
+
|
|
60
186
|
try:
|
|
187
|
+
# Try to get existing backend first
|
|
61
188
|
from chuk_ai_session_manager.session_storage import get_backend
|
|
62
189
|
get_backend() # This will trigger setup if needed
|
|
190
|
+
logger.debug("Storage backend already configured")
|
|
191
|
+
return True
|
|
63
192
|
except Exception:
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
193
|
+
# Setup with defaults if not configured
|
|
194
|
+
try:
|
|
195
|
+
setup_chuk_sessions_storage(
|
|
196
|
+
sandbox_id=sandbox_id,
|
|
197
|
+
default_ttl_hours=default_ttl_hours
|
|
198
|
+
)
|
|
199
|
+
logger.info(f"Auto-configured storage with sandbox_id='{sandbox_id}'")
|
|
200
|
+
return True
|
|
201
|
+
except Exception as e:
|
|
202
|
+
logger.error(f"Failed to auto-setup storage: {e}")
|
|
203
|
+
return False
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
def configure_storage(sandbox_id: str = "chuk-ai-session-manager",
|
|
207
|
+
default_ttl_hours: int = 24) -> bool:
|
|
208
|
+
"""
|
|
209
|
+
Explicitly configure the storage backend.
|
|
210
|
+
|
|
211
|
+
Args:
|
|
212
|
+
sandbox_id: CHUK Sessions sandbox ID to use
|
|
213
|
+
default_ttl_hours: Default TTL for sessions
|
|
214
|
+
|
|
215
|
+
Returns:
|
|
216
|
+
True if configuration was successful, False otherwise
|
|
217
|
+
"""
|
|
218
|
+
return _auto_setup_storage(sandbox_id, default_ttl_hours)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def get_version() -> str:
|
|
222
|
+
"""Get the package version."""
|
|
223
|
+
return __version__
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def is_available() -> dict:
|
|
227
|
+
"""
|
|
228
|
+
Check which components are available.
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
Dictionary showing availability of each component
|
|
232
|
+
"""
|
|
233
|
+
return {
|
|
234
|
+
"core_enums": EventSource is not None and EventType is not None,
|
|
235
|
+
"core_models": Session is not None and SessionEvent is not None,
|
|
236
|
+
"simple_api": SessionManager is not None,
|
|
237
|
+
"storage": setup_chuk_sessions_storage is not None,
|
|
238
|
+
"infinite_context": InfiniteConversationManager is not None,
|
|
239
|
+
"tool_processor": SessionAwareToolProcessor is not None,
|
|
240
|
+
"prompt_builder": build_prompt_from_session is not None,
|
|
241
|
+
"token_tracking": TokenUsage is not None,
|
|
242
|
+
"exceptions": True, # Always available (fallbacks defined)
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
# Main exports - prioritize what works
|
|
247
|
+
__all__ = []
|
|
248
|
+
|
|
249
|
+
# Always available
|
|
250
|
+
__all__.extend([
|
|
251
|
+
"__version__",
|
|
252
|
+
"get_version",
|
|
253
|
+
"is_available",
|
|
254
|
+
"configure_storage",
|
|
255
|
+
])
|
|
256
|
+
|
|
257
|
+
# Add exception classes (always available)
|
|
258
|
+
__all__.extend([
|
|
259
|
+
"SessionManagerError",
|
|
260
|
+
"SessionNotFound",
|
|
261
|
+
"SessionAlreadyExists",
|
|
262
|
+
"InvalidSessionOperation",
|
|
263
|
+
"TokenLimitExceeded",
|
|
264
|
+
"StorageError",
|
|
265
|
+
"ToolProcessingError",
|
|
266
|
+
])
|
|
267
|
+
|
|
268
|
+
# Add available components conditionally
|
|
269
|
+
if EventSource is not None:
|
|
270
|
+
__all__.append("EventSource")
|
|
271
|
+
if EventType is not None:
|
|
272
|
+
__all__.append("EventType")
|
|
273
|
+
|
|
274
|
+
if setup_chuk_sessions_storage is not None:
|
|
275
|
+
__all__.append("setup_chuk_sessions_storage")
|
|
276
|
+
|
|
277
|
+
# Simple API (most important for users)
|
|
278
|
+
if SessionManager is not None:
|
|
279
|
+
__all__.extend([
|
|
280
|
+
"SessionManager",
|
|
281
|
+
"track_conversation",
|
|
282
|
+
"track_llm_call",
|
|
283
|
+
"quick_conversation",
|
|
284
|
+
"track_infinite_conversation",
|
|
285
|
+
])
|
|
286
|
+
|
|
287
|
+
# Core models
|
|
288
|
+
if Session is not None:
|
|
289
|
+
__all__.append("Session")
|
|
290
|
+
if SessionEvent is not None:
|
|
291
|
+
__all__.append("SessionEvent")
|
|
292
|
+
if SessionMetadata is not None:
|
|
293
|
+
__all__.append("SessionMetadata")
|
|
294
|
+
if SessionRun is not None:
|
|
295
|
+
__all__.extend(["SessionRun", "RunStatus"])
|
|
296
|
+
if TokenUsage is not None:
|
|
297
|
+
__all__.append("TokenUsage")
|
|
298
|
+
if TokenSummary is not None:
|
|
299
|
+
__all__.append("TokenSummary")
|
|
300
|
+
|
|
301
|
+
# Advanced components
|
|
302
|
+
if InfiniteConversationManager is not None:
|
|
303
|
+
__all__.append("InfiniteConversationManager")
|
|
304
|
+
if SessionAwareToolProcessor is not None:
|
|
305
|
+
__all__.append("SessionAwareToolProcessor")
|
|
306
|
+
if build_prompt_from_session is not None:
|
|
307
|
+
__all__.extend(["build_prompt_from_session", "PromptStrategy"])
|
|
308
|
+
|
|
309
|
+
# Auto-setup on import (with error handling)
|
|
310
|
+
try:
|
|
311
|
+
_auto_setup_storage()
|
|
312
|
+
except Exception as e:
|
|
313
|
+
logger.debug(f"Auto-setup failed (this is normal on first import): {e}")
|
|
314
|
+
|
|
315
|
+
# Log successful import
|
|
316
|
+
available = is_available()
|
|
317
|
+
available_count = sum(available.values())
|
|
318
|
+
total_count = len(available)
|
|
319
|
+
logger.debug(f"CHUK AI Session Manager imported successfully "
|
|
320
|
+
f"({available_count}/{total_count} components available)")
|
|
321
|
+
|
|
322
|
+
# Show warning if core components are missing
|
|
323
|
+
if not available.get("simple_api", False):
|
|
324
|
+
logger.warning(
|
|
325
|
+
"Simple API not available - you may need to install missing dependencies. "
|
|
326
|
+
"Check the logs above for specific import errors."
|
|
327
|
+
)
|
|
328
|
+
elif available_count == total_count:
|
|
329
|
+
logger.debug("All components loaded successfully")
|