mem-llm 1.0.2__py3-none-any.whl → 2.1.0__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.
Potentially problematic release.
This version of mem-llm might be problematic. Click here for more details.
- mem_llm/__init__.py +71 -8
- mem_llm/api_server.py +595 -0
- mem_llm/base_llm_client.py +201 -0
- mem_llm/builtin_tools.py +311 -0
- mem_llm/builtin_tools_async.py +170 -0
- mem_llm/cli.py +254 -0
- mem_llm/clients/__init__.py +22 -0
- mem_llm/clients/lmstudio_client.py +393 -0
- mem_llm/clients/ollama_client.py +354 -0
- mem_llm/config.yaml.example +1 -1
- mem_llm/config_from_docs.py +1 -1
- mem_llm/config_manager.py +5 -3
- mem_llm/conversation_summarizer.py +372 -0
- mem_llm/data_export_import.py +640 -0
- mem_llm/dynamic_prompt.py +298 -0
- mem_llm/llm_client.py +77 -14
- mem_llm/llm_client_factory.py +260 -0
- mem_llm/logger.py +129 -0
- mem_llm/mem_agent.py +1178 -87
- mem_llm/memory_db.py +290 -59
- mem_llm/memory_manager.py +60 -1
- mem_llm/prompt_security.py +304 -0
- mem_llm/response_metrics.py +221 -0
- mem_llm/retry_handler.py +193 -0
- mem_llm/thread_safe_db.py +301 -0
- mem_llm/tool_system.py +537 -0
- mem_llm/vector_store.py +278 -0
- mem_llm/web_launcher.py +129 -0
- mem_llm/web_ui/README.md +44 -0
- mem_llm/web_ui/__init__.py +7 -0
- mem_llm/web_ui/index.html +641 -0
- mem_llm/web_ui/memory.html +569 -0
- mem_llm/web_ui/metrics.html +75 -0
- mem_llm-2.1.0.dist-info/METADATA +753 -0
- mem_llm-2.1.0.dist-info/RECORD +40 -0
- {mem_llm-1.0.2.dist-info → mem_llm-2.1.0.dist-info}/WHEEL +1 -1
- mem_llm-2.1.0.dist-info/entry_points.txt +3 -0
- mem_llm/prompt_templates.py +0 -244
- mem_llm-1.0.2.dist-info/METADATA +0 -382
- mem_llm-1.0.2.dist-info/RECORD +0 -15
- {mem_llm-1.0.2.dist-info → mem_llm-2.1.0.dist-info}/top_level.txt +0 -0
mem_llm/logger.py
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enhanced Logging System for Mem-LLM
|
|
3
|
+
====================================
|
|
4
|
+
Provides structured logging with different levels and output formats.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
import sys
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
from typing import Optional
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class MemLLMLogger:
|
|
15
|
+
"""Structured logger for Mem-LLM with file and console output"""
|
|
16
|
+
|
|
17
|
+
def __init__(self,
|
|
18
|
+
name: str = "mem_llm",
|
|
19
|
+
log_file: Optional[str] = None,
|
|
20
|
+
log_level: str = "INFO",
|
|
21
|
+
console_output: bool = True):
|
|
22
|
+
"""
|
|
23
|
+
Initialize logger
|
|
24
|
+
|
|
25
|
+
Args:
|
|
26
|
+
name: Logger name
|
|
27
|
+
log_file: Path to log file (optional)
|
|
28
|
+
log_level: Logging level (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
|
29
|
+
console_output: Enable console output
|
|
30
|
+
"""
|
|
31
|
+
self.logger = logging.getLogger(name)
|
|
32
|
+
self.logger.setLevel(getattr(logging, log_level.upper()))
|
|
33
|
+
|
|
34
|
+
# Clear existing handlers
|
|
35
|
+
self.logger.handlers = []
|
|
36
|
+
|
|
37
|
+
# Formatter
|
|
38
|
+
formatter = logging.Formatter(
|
|
39
|
+
'%(asctime)s | %(name)s | %(levelname)s | %(message)s',
|
|
40
|
+
datefmt='%Y-%m-%d %H:%M:%S'
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# Console handler
|
|
44
|
+
if console_output:
|
|
45
|
+
console_handler = logging.StreamHandler(sys.stdout)
|
|
46
|
+
console_handler.setFormatter(formatter)
|
|
47
|
+
self.logger.addHandler(console_handler)
|
|
48
|
+
|
|
49
|
+
# File handler
|
|
50
|
+
if log_file:
|
|
51
|
+
log_path = Path(log_file)
|
|
52
|
+
log_path.parent.mkdir(parents=True, exist_ok=True)
|
|
53
|
+
file_handler = logging.FileHandler(log_file, encoding='utf-8')
|
|
54
|
+
file_handler.setFormatter(formatter)
|
|
55
|
+
self.logger.addHandler(file_handler)
|
|
56
|
+
|
|
57
|
+
def debug(self, message: str, **kwargs):
|
|
58
|
+
"""Debug level log"""
|
|
59
|
+
extra_info = " | ".join(f"{k}={v}" for k, v in kwargs.items())
|
|
60
|
+
full_message = f"{message} | {extra_info}" if extra_info else message
|
|
61
|
+
self.logger.debug(full_message)
|
|
62
|
+
|
|
63
|
+
def info(self, message: str, **kwargs):
|
|
64
|
+
"""Info level log"""
|
|
65
|
+
extra_info = " | ".join(f"{k}={v}" for k, v in kwargs.items())
|
|
66
|
+
full_message = f"{message} | {extra_info}" if extra_info else message
|
|
67
|
+
self.logger.info(full_message)
|
|
68
|
+
|
|
69
|
+
def warning(self, message: str, **kwargs):
|
|
70
|
+
"""Warning level log"""
|
|
71
|
+
extra_info = " | ".join(f"{k}={v}" for k, v in kwargs.items())
|
|
72
|
+
full_message = f"{message} | {extra_info}" if extra_info else message
|
|
73
|
+
self.logger.warning(full_message)
|
|
74
|
+
|
|
75
|
+
def error(self, message: str, **kwargs):
|
|
76
|
+
"""Error level log"""
|
|
77
|
+
extra_info = " | ".join(f"{k}={v}" for k, v in kwargs.items())
|
|
78
|
+
full_message = f"{message} | {extra_info}" if extra_info else message
|
|
79
|
+
self.logger.error(full_message)
|
|
80
|
+
|
|
81
|
+
def critical(self, message: str, **kwargs):
|
|
82
|
+
"""Critical level log"""
|
|
83
|
+
extra_info = " | ".join(f"{k}={v}" for k, v in kwargs.items())
|
|
84
|
+
full_message = f"{message} | {extra_info}" if extra_info else message
|
|
85
|
+
self.logger.critical(full_message)
|
|
86
|
+
|
|
87
|
+
def log_llm_call(self, model: str, prompt_length: int, response_length: int, duration: float):
|
|
88
|
+
"""Log LLM API call with metrics"""
|
|
89
|
+
self.info(
|
|
90
|
+
"LLM API Call",
|
|
91
|
+
model=model,
|
|
92
|
+
prompt_tokens=prompt_length,
|
|
93
|
+
response_tokens=response_length,
|
|
94
|
+
duration_ms=f"{duration*1000:.2f}"
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
def log_memory_operation(self, operation: str, user_id: str, success: bool, details: str = ""):
|
|
98
|
+
"""Log memory operations"""
|
|
99
|
+
level = self.info if success else self.error
|
|
100
|
+
level(
|
|
101
|
+
f"Memory {operation}",
|
|
102
|
+
user_id=user_id,
|
|
103
|
+
success=success,
|
|
104
|
+
details=details
|
|
105
|
+
)
|
|
106
|
+
|
|
107
|
+
def log_error_with_context(self, error: Exception, context: dict):
|
|
108
|
+
"""Log error with full context"""
|
|
109
|
+
self.error(
|
|
110
|
+
f"Exception: {type(error).__name__}: {str(error)}",
|
|
111
|
+
**context
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def get_logger(name: str = "mem_llm",
|
|
116
|
+
log_file: Optional[str] = "logs/mem_llm.log",
|
|
117
|
+
log_level: str = "INFO") -> MemLLMLogger:
|
|
118
|
+
"""
|
|
119
|
+
Get or create logger instance
|
|
120
|
+
|
|
121
|
+
Args:
|
|
122
|
+
name: Logger name
|
|
123
|
+
log_file: Log file path
|
|
124
|
+
log_level: Logging level
|
|
125
|
+
|
|
126
|
+
Returns:
|
|
127
|
+
MemLLMLogger instance
|
|
128
|
+
"""
|
|
129
|
+
return MemLLMLogger(name=name, log_file=log_file, log_level=log_level)
|