wizelit-sdk 0.1.29__py3-none-any.whl → 0.1.31__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.
wizelit_sdk/__init__.py CHANGED
@@ -6,6 +6,42 @@ from wizelit_sdk.agent_wrapper.job import Job
6
6
  from wizelit_sdk.agent_wrapper.streaming import LogStreamer
7
7
  from wizelit_sdk.models.base import BaseModel
8
8
  from wizelit_sdk.models.job import JobModel, JobLogModel, JobStatus
9
+ from wizelit_sdk.exceptions import (
10
+ WizelitSDKException,
11
+ AgentInitializationError,
12
+ SignatureValidationError,
13
+ JobExecutionError,
14
+ JobNotFoundError,
15
+ ToolRegistrationError,
16
+ DatabaseManagerError,
17
+ StreamingError,
18
+ ContextVariableError,
19
+ InvalidConfigError,
20
+ TransportError,
21
+ TimeoutError,
22
+ )
9
23
 
10
- __all__ = ["WizelitAgent", "DatabaseManager", "Job", "LogStreamer", "BaseModel", "JobModel", "JobLogModel", "JobStatus"]
24
+ __all__ = [
25
+ "WizelitAgent",
26
+ "DatabaseManager",
27
+ "Job",
28
+ "LogStreamer",
29
+ "BaseModel",
30
+ "JobModel",
31
+ "JobLogModel",
32
+ "JobStatus",
33
+ # Exceptions
34
+ "WizelitSDKException",
35
+ "AgentInitializationError",
36
+ "SignatureValidationError",
37
+ "JobExecutionError",
38
+ "JobNotFoundError",
39
+ "ToolRegistrationError",
40
+ "DatabaseManagerError",
41
+ "StreamingError",
42
+ "ContextVariableError",
43
+ "InvalidConfigError",
44
+ "TransportError",
45
+ "TimeoutError",
46
+ ]
11
47
 
@@ -13,6 +13,9 @@ from wizelit_sdk.agent_wrapper.signature_validation import (
13
13
  bind_and_validate_arguments,
14
14
  ensure_type_hints,
15
15
  )
16
+ from wizelit_sdk.exceptions import (
17
+ StreamingError,
18
+ )
16
19
 
17
20
  # Local Transport literal to avoid import issues when fastmcp.types is unavailable
18
21
  Transport = Literal["stdio", "http", "sse", "streamable-http"]
@@ -92,7 +95,10 @@ class WizelitAgent:
92
95
  except ImportError:
93
96
  print("Warning: redis package not installed. Log streaming disabled.")
94
97
  except Exception as e:
95
- print(f"Warning: Failed to initialize log streamer: {e}")
98
+ raise StreamingError(
99
+ "Failed to initialize log streaming",
100
+ f"Could not connect to Redis at {redis_url}: {str(e)}"
101
+ )
96
102
 
97
103
  print(
98
104
  f"WizelitAgent initialized with name: {name}, transport: {transport}, host: {host}, port: {port}"
@@ -6,7 +6,7 @@ import asyncio
6
6
  import uuid
7
7
  import time
8
8
  from datetime import datetime, UTC
9
- from typing import List, Optional, Awaitable, Any, TYPE_CHECKING
9
+ from typing import Optional, Awaitable, Any, TYPE_CHECKING
10
10
  from fastmcp import Context
11
11
 
12
12
  if TYPE_CHECKING:
@@ -19,7 +19,7 @@ class MemoryLogHandler(logging.Handler):
19
19
  Custom logging handler that stores log messages in a list.
20
20
  """
21
21
 
22
- def __init__(self, logs_list: List[str]):
22
+ def __init__(self, logs_list: list[str]):
23
23
  super().__init__()
24
24
  self.logs_list = logs_list
25
25
  self.setFormatter(logging.Formatter('%(message)s'))
@@ -156,7 +156,7 @@ class Job:
156
156
  self._ctx = ctx
157
157
  self._id = job_id or f"JOB-{str(uuid.uuid4())[:8]}"
158
158
  self._status = "running"
159
- self._logs: List[str] = []
159
+ self._logs: list[str] = []
160
160
  self._result: Optional[str] = None
161
161
  self._error: Optional[str] = None
162
162
  self._db_manager = db_manager
@@ -176,7 +176,7 @@ class Job:
176
176
  return self._logger
177
177
 
178
178
  @property
179
- def logs(self) -> List[str]:
179
+ def logs(self) -> list[str]:
180
180
  """List of log messages (timestamped strings)."""
181
181
  return self._logs
182
182
 
@@ -196,11 +196,11 @@ class LogStreamer:
196
196
  self._redis = None
197
197
  logger.info("Redis connection closed")
198
198
 
199
- async def __aenter__(self):
199
+ async def __aenter__(self) -> 'LogStreamer':
200
200
  """Async context manager entry."""
201
201
  await self._ensure_connected()
202
202
  return self
203
203
 
204
- async def __aexit__(self, exc_type, exc_val, exc_tb):
204
+ async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
205
205
  """Async context manager exit."""
206
206
  await self.close()
wizelit_sdk/database.py CHANGED
@@ -132,7 +132,7 @@ class DatabaseManager:
132
132
  finally:
133
133
  await session.close()
134
134
 
135
- async def close(self):
135
+ async def close(self) -> None:
136
136
  """Dispose of the engine and close all connections."""
137
137
  await self.engine.dispose()
138
138
  logger.info("Database connections closed")
@@ -0,0 +1,206 @@
1
+ """
2
+ Custom exceptions for Wizelit SDK with helpful error messages and suggestions.
3
+ """
4
+
5
+
6
+ class WizelitSDKException(Exception):
7
+ """Base exception class for all Wizelit SDK errors."""
8
+
9
+ def __init__(self, message: str, suggestion: str = ""):
10
+ self.message = message
11
+ self.suggestion = suggestion
12
+ full_message = message
13
+ if suggestion:
14
+ full_message = f"{message}\n💡 Suggestion: {suggestion}"
15
+ super().__init__(full_message)
16
+
17
+
18
+ class AgentInitializationError(WizelitSDKException):
19
+ """Raised when WizelitAgent cannot be initialized."""
20
+
21
+ def __init__(self, reason: str = "", original_error: str = ""):
22
+ message = "Failed to initialize WizelitAgent"
23
+ if reason:
24
+ message += f": {reason}"
25
+ if original_error:
26
+ message += f" ({original_error})"
27
+ suggestion = (
28
+ "1. Verify all required dependencies are installed\n"
29
+ "2. Check that the name parameter is provided\n"
30
+ "3. Verify the transport mode is valid (sse, http, streamable-http, stdio)\n"
31
+ "4. Check that host and port are available and not in use\n"
32
+ "5. Review the initialization code for configuration errors"
33
+ )
34
+ super().__init__(message, suggestion)
35
+
36
+
37
+ class SignatureValidationError(WizelitSDKException):
38
+ """Raised when a function signature doesn't meet requirements."""
39
+
40
+ def __init__(self, function_name: str, reason: str = ""):
41
+ message = f"Signature validation failed for function '{function_name}'"
42
+ if reason:
43
+ message += f": {reason}"
44
+ suggestion = (
45
+ f"1. Ensure all parameters of '{function_name}' have type hints\n"
46
+ f"2. Verify parameter names match between definition and usage\n"
47
+ f"3. Check that the function signature is compatible with the ingest decorator\n"
48
+ f"4. Ensure complex types are properly imported and defined\n"
49
+ f"5. Review the decorator parameters for compatibility"
50
+ )
51
+ super().__init__(message, suggestion)
52
+
53
+
54
+ class JobExecutionError(WizelitSDKException):
55
+ """Raised when a job fails during execution."""
56
+
57
+ def __init__(self, job_id: str, reason: str = "", original_error: str = ""):
58
+ message = f"Job execution failed for job_id '{job_id}'"
59
+ if reason:
60
+ message += f": {reason}"
61
+ if original_error:
62
+ message += f" ({original_error})"
63
+ suggestion = (
64
+ "1. Check the job logs for detailed error information\n"
65
+ "2. Verify job inputs are valid and complete\n"
66
+ "3. Check if the underlying tool/function has dependencies\n"
67
+ "4. Try running the job again with the same inputs\n"
68
+ "5. Check application logs and database logs for more context"
69
+ )
70
+ super().__init__(message, suggestion)
71
+
72
+
73
+ class JobNotFoundError(WizelitSDKException):
74
+ """Raised when a job cannot be found."""
75
+
76
+ def __init__(self, job_id: str):
77
+ message = f"Job not found: {job_id}"
78
+ suggestion = (
79
+ "1. Verify the job_id is correct and complete\n"
80
+ "2. Check if the job has expired or been deleted\n"
81
+ "3. Verify the job was created in the current session\n"
82
+ "4. Check the database for job records\n"
83
+ "5. Review job retention policies"
84
+ )
85
+ super().__init__(message, suggestion)
86
+
87
+
88
+ class ToolRegistrationError(WizelitSDKException):
89
+ """Raised when a tool cannot be registered with the MCP server."""
90
+
91
+ def __init__(self, tool_name: str, reason: str = ""):
92
+ message = f"Failed to register tool '{tool_name}' with MCP server"
93
+ if reason:
94
+ message += f": {reason}"
95
+ suggestion = (
96
+ f"1. Verify '{tool_name}' function is properly decorated with @ingest\n"
97
+ f"2. Check that function name is unique across all registered tools\n"
98
+ f"3. Verify function signature is valid with type hints\n"
99
+ f"4. Check for duplicate tool registrations\n"
100
+ f"5. Ensure the FastMCP server is properly initialized"
101
+ )
102
+ super().__init__(message, suggestion)
103
+
104
+
105
+ class DatabaseManagerError(WizelitSDKException):
106
+ """Raised when database operations fail."""
107
+
108
+ def __init__(self, operation: str, reason: str = ""):
109
+ message = f"Database operation failed: {operation}"
110
+ if reason:
111
+ message += f" ({reason})"
112
+ suggestion = (
113
+ "1. Verify the database is running and accessible\n"
114
+ "2. Check database connection parameters (host, port, credentials)\n"
115
+ "3. Verify the database has sufficient disk space\n"
116
+ "4. Check if the database tables are properly initialized\n"
117
+ "5. Review database logs for detailed error information"
118
+ )
119
+ super().__init__(message, suggestion)
120
+
121
+
122
+ class StreamingError(WizelitSDKException):
123
+ """Raised when log streaming fails."""
124
+
125
+ def __init__(self, reason: str = "", original_error: str = ""):
126
+ message = "Error in log streaming"
127
+ if reason:
128
+ message += f": {reason}"
129
+ if original_error:
130
+ message += f" ({original_error})"
131
+ suggestion = (
132
+ "1. Verify Redis is running and accessible\n"
133
+ "2. Check REDIS_URL environment variable is set correctly\n"
134
+ "3. Verify network connectivity to Redis\n"
135
+ "4. Check Redis logs for connection errors\n"
136
+ "5. Log streaming is optional - the SDK will continue without it"
137
+ )
138
+ super().__init__(message, suggestion)
139
+
140
+
141
+ class ContextVariableError(WizelitSDKException):
142
+ """Raised when context variable operations fail."""
143
+
144
+ def __init__(self, variable_name: str, reason: str = ""):
145
+ message = f"Error accessing context variable '{variable_name}'"
146
+ if reason:
147
+ message += f": {reason}"
148
+ suggestion = (
149
+ f"1. Ensure '{variable_name}' is set before accessing\n"
150
+ f"2. Verify the context is active in the current async task\n"
151
+ f"3. Check if using the decorator or dependency injection correctly\n"
152
+ f"4. Ensure context propagation across async calls\n"
153
+ f"5. Review context variable usage documentation"
154
+ )
155
+ super().__init__(message, suggestion)
156
+
157
+
158
+ class InvalidConfigError(WizelitSDKException):
159
+ """Raised when configuration is invalid or missing."""
160
+
161
+ def __init__(self, config_key: str, expected_type: str = "", reason: str = ""):
162
+ message = f"Invalid configuration for '{config_key}'"
163
+ if expected_type:
164
+ message += f" (expected: {expected_type})"
165
+ if reason:
166
+ message += f": {reason}"
167
+ suggestion = (
168
+ f"1. Verify {config_key} is set in environment variables\n"
169
+ f"2. Check the value format and type\n"
170
+ f"3. Review configuration documentation for valid values\n"
171
+ f"4. Check .env file or deployment configuration\n"
172
+ f"5. Restart the application after fixing configuration"
173
+ )
174
+ super().__init__(message, suggestion)
175
+
176
+
177
+ class TransportError(WizelitSDKException):
178
+ """Raised when transport/communication errors occur."""
179
+
180
+ def __init__(self, transport_type: str, reason: str = ""):
181
+ message = f"Transport error with '{transport_type}'"
182
+ if reason:
183
+ message += f": {reason}"
184
+ suggestion = (
185
+ f"1. Verify the {transport_type} transport is properly configured\n"
186
+ f"2. Check network connectivity and firewall rules\n"
187
+ f"3. Verify server ports are open and accessible\n"
188
+ f"4. Check if there are proxy or routing issues\n"
189
+ f"5. Review transport-specific logs for detailed information"
190
+ )
191
+ super().__init__(message, suggestion)
192
+
193
+
194
+ class TimeoutError(WizelitSDKException):
195
+ """Raised when an operation exceeds the timeout limit."""
196
+
197
+ def __init__(self, operation: str, timeout_seconds: float):
198
+ message = f"Operation '{operation}' exceeded timeout of {timeout_seconds} seconds"
199
+ suggestion = (
200
+ f"1. The {operation} took too long to complete\n"
201
+ f"2. Check if there are resource constraints (CPU, memory)\n"
202
+ f"3. Simplify the job inputs or query\n"
203
+ f"4. Check application and system logs for bottlenecks\n"
204
+ f"5. Consider increasing timeout if the operation is expected to be slow"
205
+ )
206
+ super().__init__(message, suggestion)
@@ -3,6 +3,7 @@ from sqlalchemy import Column
3
3
  from sqlalchemy.dialects.postgresql import UUID
4
4
  import uuid
5
5
  from datetime import datetime
6
+ from typing import Dict, Any
6
7
 
7
8
  Base = declarative_base()
8
9
 
@@ -10,7 +11,7 @@ class TimestampMixin:
10
11
  """Mixin for models that need timestamp functionality."""
11
12
 
12
13
  @staticmethod
13
- def get_timestamp():
14
+ def get_timestamp() -> str:
14
15
  return datetime.utcnow().isoformat()
15
16
 
16
17
 
@@ -20,6 +21,6 @@ class BaseModel(Base):
20
21
 
21
22
  id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
22
23
 
23
- def to_dict(self):
24
+ def to_dict(self) -> Dict[str, Any]:
24
25
  """Convert model to dictionary."""
25
26
  return {c.name: getattr(self, c.name) for c in self.__table__.columns}
wizelit_sdk/models/job.py CHANGED
@@ -41,7 +41,7 @@ class JobModel(BaseModel):
41
41
  Index('idx_job_created_at', 'created_at'),
42
42
  )
43
43
 
44
- def __repr__(self):
44
+ def __repr__(self) -> str:
45
45
  return f"<JobModel(id={self.id}, status={self.status})>"
46
46
 
47
47
 
@@ -68,5 +68,5 @@ class JobLogModel(BaseModel):
68
68
  Index('idx_job_log_job_id_timestamp', 'job_id', 'timestamp'),
69
69
  )
70
70
 
71
- def __repr__(self):
71
+ def __repr__(self) -> str:
72
72
  return f"<JobLogModel(id={self.id}, job_id={self.job_id}, level={self.level})>"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wizelit-sdk
3
- Version: 0.1.29
3
+ Version: 0.1.31
4
4
  Summary: Wizelit Agent Wrapper - Internal utility package
5
5
  Author-email: Your Name <your.email@company.com>
6
6
  Requires-Python: >=3.10
@@ -0,0 +1,14 @@
1
+ wizelit_sdk/__init__.py,sha256=GRV3STJaNUg2KelKmvU60nhpYMdQ5lX0_FQyV_e5g1I,1168
2
+ wizelit_sdk/database.py,sha256=HzvMY-KZQBkGs-Ey_wKAIPOJEb5BqGjEi98Tip7CQBo,4830
3
+ wizelit_sdk/exceptions.py,sha256=KHkexTbD5t05nD-t9RnrJIFcqOsATBOUX9y5uHVfQeE,8557
4
+ wizelit_sdk/agent_wrapper/__init__.py,sha256=srVcHZfvpf3q8m2nzIST6Ofl2V8Vv5GRtcNXudOLiD8,333
5
+ wizelit_sdk/agent_wrapper/agent_wrapper.py,sha256=2IE1RXTpwzJJMnpEgetU8OCkR7txG_NMqJ-1W-rv9j0,23650
6
+ wizelit_sdk/agent_wrapper/job.py,sha256=jW2Cl7QvSgZDUqWqZSND-V1XphGdISJuh9ViHgCn7iU,13770
7
+ wizelit_sdk/agent_wrapper/signature_validation.py,sha256=Njplwofw36jXoWgBooaZCbwhkf72pR-UoRQ3Q6-biro,3729
8
+ wizelit_sdk/agent_wrapper/streaming.py,sha256=l7SbvPuQYMdGO38t1upyI5wTVdd5eB-2BSwU-BQSlvc,6673
9
+ wizelit_sdk/models/__init__.py,sha256=UB7nfHoE6hGcjfzy7w8AmuKVmYrTg9wIgGjG8GWziJ0,143
10
+ wizelit_sdk/models/base.py,sha256=11XyxLUG0VjdiNxe4zmzGDUjKEOsjSvUjA8yaQgfCa0,758
11
+ wizelit_sdk/models/job.py,sha256=HD8ohVqzakC8J7VAwmh8UCi_BLLiqx85TbR0FjO2rlg,2494
12
+ wizelit_sdk-0.1.31.dist-info/METADATA,sha256=fOk9ur63IBthIIyjAMPW-cjahQVWycOAgPsy2ORfqOY,3297
13
+ wizelit_sdk-0.1.31.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
14
+ wizelit_sdk-0.1.31.dist-info/RECORD,,
@@ -1,13 +0,0 @@
1
- wizelit_sdk/__init__.py,sha256=76Dt-WxNbEJwOCPqu2P9AooVSQoGmc8-CH1fxIWJ5Lo,471
2
- wizelit_sdk/database.py,sha256=6F2Nyt-sr5U5GkAB9OeSCU-iv2byZBDsg7aXqCl-ntk,4822
3
- wizelit_sdk/agent_wrapper/__init__.py,sha256=srVcHZfvpf3q8m2nzIST6Ofl2V8Vv5GRtcNXudOLiD8,333
4
- wizelit_sdk/agent_wrapper/agent_wrapper.py,sha256=qkskmRRjhIooXVeyZHbH5q1OIp30zw29bBRUoqTPYLE,23476
5
- wizelit_sdk/agent_wrapper/job.py,sha256=Gk2CyLBQFzIosYuGrqUj6_rZ9kDIO6YLYQ7Pxk6ASuM,13776
6
- wizelit_sdk/agent_wrapper/signature_validation.py,sha256=Njplwofw36jXoWgBooaZCbwhkf72pR-UoRQ3Q6-biro,3729
7
- wizelit_sdk/agent_wrapper/streaming.py,sha256=f0VV3IzGAlfQY_cw2OHgxWjvM16Hs42_b700EUX2QpY,6633
8
- wizelit_sdk/models/__init__.py,sha256=UB7nfHoE6hGcjfzy7w8AmuKVmYrTg9wIgGjG8GWziJ0,143
9
- wizelit_sdk/models/base.py,sha256=aEPGMZVczKnlWz4Ps99e_xI5TcuSV3DxCigRMU5BnhE,704
10
- wizelit_sdk/models/job.py,sha256=P68Vb1k77Z_Tha4dE0GzrLPa0LJrnMCxyYMENZyD7Kc,2480
11
- wizelit_sdk-0.1.29.dist-info/METADATA,sha256=iHeysF2Hd1I49-GtFeqEVIfmK0u_LHQIXtFc5OavD0g,3297
12
- wizelit_sdk-0.1.29.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
13
- wizelit_sdk-0.1.29.dist-info/RECORD,,