genxai-framework 0.1.1__py3-none-any.whl → 0.1.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.
genxai/connectors/base.py CHANGED
@@ -4,7 +4,7 @@ from __future__ import annotations
4
4
 
5
5
  from abc import ABC, abstractmethod
6
6
  from dataclasses import dataclass, field
7
- from datetime import datetime
7
+ from datetime import datetime, UTC
8
8
  from enum import Enum
9
9
  from typing import Any, Awaitable, Callable, Dict, Optional
10
10
  import asyncio
@@ -29,7 +29,7 @@ class ConnectorEvent:
29
29
 
30
30
  connector_id: str
31
31
  payload: Dict[str, Any]
32
- timestamp: datetime = field(default_factory=datetime.utcnow)
32
+ timestamp: datetime = field(default_factory=lambda: datetime.now(UTC))
33
33
  metadata: Dict[str, Any] = field(default_factory=dict)
34
34
 
35
35
 
@@ -106,7 +106,7 @@ class Connector(ABC):
106
106
  "lifecycle": self.status.value,
107
107
  "last_error": self._last_error,
108
108
  }
109
- self._last_healthcheck = datetime.utcnow().isoformat()
109
+ self._last_healthcheck = datetime.now(UTC).isoformat()
110
110
  return payload
111
111
 
112
112
  async def validate_config(self) -> None:
@@ -4,7 +4,7 @@ import json
4
4
  import logging
5
5
  import sys
6
6
  from contextvars import ContextVar
7
- from datetime import datetime
7
+ from datetime import datetime, UTC
8
8
  from typing import Any, Dict, Optional
9
9
 
10
10
 
@@ -250,7 +250,7 @@ class StructuredLogger:
250
250
  JSON formatted log string
251
251
  """
252
252
  log_entry = {
253
- "timestamp": datetime.utcnow().isoformat(),
253
+ "timestamp": datetime.now(UTC).isoformat(),
254
254
  "level": level,
255
255
  "message": message,
256
256
  "context": {**get_log_context(), **self.context},
genxai/security/auth.py CHANGED
@@ -4,7 +4,7 @@ import secrets
4
4
  import hashlib
5
5
  import time
6
6
  from typing import Optional, List, Dict, Any
7
- from datetime import datetime, timedelta
7
+ from datetime import datetime, timedelta, UTC
8
8
  from dataclasses import dataclass
9
9
  import sqlite3
10
10
  import os
@@ -94,7 +94,7 @@ class APIKeyManager:
94
94
  # Calculate expiration
95
95
  expires_at = None
96
96
  if expires_in_days:
97
- expires_at = datetime.utcnow() + timedelta(days=expires_in_days)
97
+ expires_at = datetime.now(UTC) + timedelta(days=expires_in_days)
98
98
 
99
99
  # Store in database
100
100
  conn = sqlite3.connect(self.db_path)
@@ -103,7 +103,7 @@ class APIKeyManager:
103
103
  cursor.execute("""
104
104
  INSERT INTO api_keys (key_id, user_id, name, key_hash, created_at, expires_at)
105
105
  VALUES (?, ?, ?, ?, ?, ?)
106
- """, (key_id, user_id, name, key_hash, datetime.utcnow(), expires_at))
106
+ """, (key_id, user_id, name, key_hash, datetime.now(UTC), expires_at))
107
107
 
108
108
  conn.commit()
109
109
  conn.close()
@@ -144,14 +144,16 @@ class APIKeyManager:
144
144
  # Check expiration
145
145
  if expires_at:
146
146
  expires_dt = datetime.fromisoformat(expires_at)
147
- if datetime.utcnow() > expires_dt:
147
+ if expires_dt.tzinfo is None:
148
+ expires_dt = expires_dt.replace(tzinfo=UTC)
149
+ if datetime.now(UTC) > expires_dt:
148
150
  conn.close()
149
151
  return None
150
152
 
151
153
  # Update last used
152
154
  cursor.execute("""
153
155
  UPDATE api_keys SET last_used = ? WHERE key_id = ?
154
- """, (datetime.utcnow(), key_id))
156
+ """, (datetime.now(UTC), key_id))
155
157
 
156
158
  conn.commit()
157
159
  conn.close()
@@ -257,7 +259,9 @@ class APIKeyManager:
257
259
  expires_in_days = None
258
260
  if expires_at:
259
261
  expires_dt = datetime.fromisoformat(expires_at)
260
- expires_in_days = (expires_dt - datetime.utcnow()).days
262
+ if expires_dt.tzinfo is None:
263
+ expires_dt = expires_dt.replace(tzinfo=UTC)
264
+ expires_in_days = (expires_dt - datetime.now(UTC)).days
261
265
 
262
266
  return self.generate_key(user_id, name, expires_in_days)
263
267
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  import sqlite3
4
4
  from typing import Dict, Any, Optional
5
- from datetime import datetime, timedelta
5
+ from datetime import datetime, timedelta, UTC
6
6
  from dataclasses import dataclass
7
7
  import os
8
8
 
@@ -106,7 +106,7 @@ class TokenUsageTracker:
106
106
  INSERT INTO token_usage
107
107
  (user_id, provider, model, prompt_tokens, completion_tokens, cost, timestamp)
108
108
  VALUES (?, ?, ?, ?, ?, ?, ?)
109
- """, (user_id, provider, model, prompt_tokens, completion_tokens, cost, datetime.utcnow()))
109
+ """, (user_id, provider, model, prompt_tokens, completion_tokens, cost, datetime.now(UTC)))
110
110
 
111
111
  conn.commit()
112
112
  conn.close()
@@ -126,7 +126,7 @@ class TokenUsageTracker:
126
126
  Usage statistics
127
127
  """
128
128
  # Calculate time range
129
- now = datetime.utcnow()
129
+ now = datetime.now(UTC)
130
130
  if period == "day":
131
131
  start_time = now - timedelta(days=1)
132
132
  elif period == "week":
@@ -223,7 +223,7 @@ class BudgetManager:
223
223
  conn = sqlite3.connect(self.db_path)
224
224
  cursor = conn.cursor()
225
225
 
226
- now = datetime.utcnow()
226
+ now = datetime.now(UTC)
227
227
 
228
228
  cursor.execute("""
229
229
  INSERT OR REPLACE INTO budgets (user_id, amount, period, created_at, updated_at)
@@ -447,7 +447,7 @@ class CostAlertManager:
447
447
  # Check if we already sent alert recently (within 1 hour)
448
448
  if last_alert:
449
449
  last_alert_time = datetime.fromisoformat(last_alert)
450
- if datetime.utcnow() - last_alert_time < timedelta(hours=1):
450
+ if datetime.now(UTC) - last_alert_time < timedelta(hours=1):
451
451
  conn.close()
452
452
  return
453
453
 
@@ -462,7 +462,7 @@ class CostAlertManager:
462
462
  # Update last alert time
463
463
  cursor.execute("""
464
464
  UPDATE cost_alerts SET last_alert = ? WHERE user_id = ?
465
- """, (datetime.utcnow(), user_id))
465
+ """, (datetime.now(UTC), user_id))
466
466
 
467
467
  conn.commit()
468
468
 
genxai/security/jwt.py CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  import jwt
4
4
  import os
5
- from datetime import datetime, timedelta
5
+ from datetime import datetime, timedelta, UTC
6
6
  from typing import Dict, Any, Optional
7
7
  from dataclasses import dataclass
8
8
 
@@ -50,7 +50,7 @@ class JWTManager:
50
50
  Returns:
51
51
  JWT token string
52
52
  """
53
- now = datetime.utcnow()
53
+ now = datetime.now(UTC)
54
54
  exp = now + timedelta(seconds=expires_in)
55
55
 
56
56
  payload = {
genxai/security/pii.py CHANGED
@@ -3,7 +3,7 @@
3
3
  import re
4
4
  from typing import List, Dict, Any, Optional
5
5
  from dataclasses import dataclass
6
- from datetime import datetime
6
+ from datetime import datetime, UTC
7
7
 
8
8
 
9
9
  # PII patterns
@@ -254,7 +254,7 @@ class PIIAuditLogger:
254
254
  context: Additional context
255
255
  """
256
256
  log_entry = {
257
- "timestamp": datetime.utcnow().isoformat(),
257
+ "timestamp": datetime.now(UTC).isoformat(),
258
258
  "user_id": user_id,
259
259
  "pii_type": pii_type,
260
260
  "action": action,
@@ -2,7 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
- from datetime import datetime
5
+ from datetime import datetime, UTC
6
6
  from typing import Any, Dict, Optional
7
7
  import logging
8
8
 
@@ -52,7 +52,7 @@ class ScheduleTrigger(BaseTrigger):
52
52
  trigger = IntervalTrigger(seconds=self.interval_seconds)
53
53
 
54
54
  async def _emit_wrapper() -> None:
55
- await self.emit(payload={"scheduled_at": datetime.utcnow().isoformat(), **self.payload})
55
+ await self.emit(payload={"scheduled_at": datetime.now(UTC).isoformat(), **self.payload})
56
56
 
57
57
  scheduler.add_job(_emit_wrapper, trigger=trigger)
58
58
  scheduler.start()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: genxai-framework
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Advanced Agentic AI Framework with Graph-Based Orchestration
5
5
  Author-email: GenXAI Team <team@genxai.dev>
6
6
  License: MIT
@@ -15,7 +15,7 @@ genxai/api/app.py,sha256=lslCmIJonUhw5qTkJJPmIR6tyXoFMX9SePQr4yKKU2E,616
15
15
  genxai/config/__init__.py,sha256=oue5dGpDI3NsVaQjVBUPgEWVO9RydDvLrEGJMUEDbVc,150
16
16
  genxai/config/settings.py,sha256=WGBFen9ObRMV1xLUBkyMs4a29u2D3QXVDmd1QiJkhdo,1004
17
17
  genxai/connectors/__init__.py,sha256=smFRQqkUfTbC4aQ_pw_WYoEzGO-F4ibxyxc9qVEyWTs,992
18
- genxai/connectors/base.py,sha256=6u1J5Ko4Q98aYQdbgHIx3VDxn1kJjaW1eD5tWsdT7m8,4305
18
+ genxai/connectors/base.py,sha256=VW0Rgg8-jBHeX0OEqZF0sNXpb6UIATCDYUEzM8vnQ1o,4320
19
19
  genxai/connectors/config_store.py,sha256=c0MzEo4TiJeL2swFHkF8QdYLY4A_CchDUIeMM4sKMng,3525
20
20
  genxai/connectors/github.py,sha256=8OGScHVrH1qXK2m3QQt2AKAXJ6k3aS4bCOzWIusCjDM,3623
21
21
  genxai/connectors/google_workspace.py,sha256=zk5xQM-QhkfGBwqbQqRBFt5nNOlxmsNZdo63i9plwGE,4273
@@ -90,19 +90,19 @@ genxai/llm/providers/google.py,sha256=QiiW6aLIibAWC5Rj09YSujIazSjMw_OFNBU7BkH7Bo
90
90
  genxai/llm/providers/ollama.py,sha256=hlJb0p5JUFTKwDZOhbhbZ01hn1QMEsDTOG7Ajh-edX4,4753
91
91
  genxai/llm/providers/openai.py,sha256=nAyN0OyEVGxxDydlfmUq2ct6YuZEkm-NtbQSVl-Rwp4,8266
92
92
  genxai/observability/__init__.py,sha256=S-75DlP3jO1u7FbRFCBVHg0dMGhrM7ariMSFPDvHWJw,228
93
- genxai/observability/logging.py,sha256=nGL9rQBlty3i3YosowXUQ_JueNms4qJS0ZHGatTXWCU,9530
93
+ genxai/observability/logging.py,sha256=unODoNEprpwjTPWk6rRbGSes3eMfbFELxsj8heiH1Mw,9535
94
94
  genxai/observability/metrics.py,sha256=MwvRMd8Ae6crm-bAE1zFYm02W_3PGpI-K1tWGVHQpZ8,14625
95
95
  genxai/observability/tracing.py,sha256=Rx-tgHCA7ijeOS1cZsK0EDKhl8IrhzkI9IzTY4ivksY,11256
96
96
  genxai/performance/__init__.py,sha256=THsAmJ91Ys5B84CwjvYLfx16Tn_9mIXmZ8ibtVdXr7Y,742
97
97
  genxai/performance/cache.py,sha256=8_m7cyFi3raW-fJKzLmQ7nqW3HsLutgbzGPvWgdY5N8,7159
98
98
  genxai/performance/pooling.py,sha256=HHGvOfb6YDuBzL-YZIpn1aqNuw5NpDAZ2BEwaRENew4,8407
99
99
  genxai/security/audit.py,sha256=s-ohUnI4zNHnx6K6gf1hdhqeg8OccuSQR-fql-qlAHs,9491
100
- genxai/security/auth.py,sha256=dLB4xnZnaiGFR0xifN_jPTtLkq71TlqpvkVGULIoEfM,8928
101
- genxai/security/cost_control.py,sha256=ri8b8czr3y45G36vn5JmWRCg8aqYFBN1sXUnAGxtXDM,14892
100
+ genxai/security/auth.py,sha256=pmIBsoOVpFJcmhn3bSZdOvFS5vDHrhGBSghZb6jjKQ4,9137
101
+ genxai/security/cost_control.py,sha256=OyEoikrjvh1mky4wWGwHI2IJSqyGE8F4wWX_v1zmFIY,14897
102
102
  genxai/security/default_policies.py,sha256=-Z9C4VE6MeMkF-MybB63GXGKG5kZExX9nGUhc3y9l6E,1495
103
- genxai/security/jwt.py,sha256=e2hni92AnWp4sJCJrAQdEkbobNV64yTj6wHGD4NIEgU,3751
103
+ genxai/security/jwt.py,sha256=r4Ymsj7BxiiP1OjYtJ402Qocv_ZUpt1T-BBnvbrvmCk,3756
104
104
  genxai/security/oauth.py,sha256=xsCkTmphCtRDQ_i3myOoUzI3miAOPMlFGnzT1deakjM,7085
105
- genxai/security/pii.py,sha256=11m42MpiTjLaYBQTmK-OB2ij0Ofologn_EtLDf1UGbg,10218
105
+ genxai/security/pii.py,sha256=-qr6EwC936Q4MXqhwR6gxEdtsSYp-qaTQAITH_X_HrQ,10223
106
106
  genxai/security/policy_engine.py,sha256=u7qXThbqgyGIDp2CWu7ooiwS4WsvXpbG78PocLLqMts,2517
107
107
  genxai/security/rate_limit.py,sha256=L9OOeII0hTu9_O4itivXuubBcOUICb9v5Af2QcjGRrA,9434
108
108
  genxai/security/rbac.py,sha256=ZT1hso6ch1LmLZxisFD8IA4r9GFJwy-JHEe7FsiCKd8,6542
@@ -173,13 +173,13 @@ genxai/triggers/base.py,sha256=Kl1mc-UpHipfwTU08l3wE4q0Xrs4G1B1UfvikwMbhfY,3573
173
173
  genxai/triggers/file_watcher.py,sha256=FUaz6UQ9Y4S2HtatU2ev45JTM6uyYcyFuP_fKAYF6bQ,2482
174
174
  genxai/triggers/queue.py,sha256=-fzx8KXjz9_3fvs6nayfx3QC2F6idXVKitAFCmp4Vss,2211
175
175
  genxai/triggers/registry.py,sha256=4n_1IhRsc-7vKuTqWSjj5ftEIzTIAodSfZNgiEqiox8,2701
176
- genxai/triggers/schedule.py,sha256=lDMmkZMz3OcK23yH2RHDs3EdPW1U7AC2rB5XHb5xKKk,2264
176
+ genxai/triggers/schedule.py,sha256=eBLDUZSuRs69jsBhfOKt0gcnpVPZTLJQPybo_IAsH4E,2269
177
177
  genxai/triggers/webhook.py,sha256=Mke2J8Du7FoooPi4RfQJlNFzuKGEKdEMMSZb6POHN04,2305
178
178
  genxai/utils/__init__.py,sha256=G-QqU0cbUBxARFUvB5-AC0iU7d4wNiXRBGdVthItB6o,36
179
179
  genxai/utils/tokens.py,sha256=9tNensSqmB2OgmbgLRouwzuTZAMm-DDf5Z0Ladyrw34,8941
180
- genxai_framework-0.1.1.dist-info/licenses/LICENSE,sha256=Uhsc-LcYGNEbJle0w4oeluHqh_W1SJxrN-_M4UxhoH8,1068
181
- genxai_framework-0.1.1.dist-info/METADATA,sha256=5c-nHQrR0VXu5iMHaXkgPc4ezPkyfta84-NF-pMIRPM,17270
182
- genxai_framework-0.1.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
183
- genxai_framework-0.1.1.dist-info/entry_points.txt,sha256=f9AdbBidEnMS9u_UNPlWV8LCR-8Kp_93YxVP357WdoM,41
184
- genxai_framework-0.1.1.dist-info/top_level.txt,sha256=Jqpp4DVVrqhEJL8WeKrExKNLEX3TIWdMAr7Gm3PU9SA,11
185
- genxai_framework-0.1.1.dist-info/RECORD,,
180
+ genxai_framework-0.1.2.dist-info/licenses/LICENSE,sha256=Uhsc-LcYGNEbJle0w4oeluHqh_W1SJxrN-_M4UxhoH8,1068
181
+ genxai_framework-0.1.2.dist-info/METADATA,sha256=NEWGHCJh2KmeUv4rzxlGVNt6okVlWUtfWNNCivhigFI,17270
182
+ genxai_framework-0.1.2.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
183
+ genxai_framework-0.1.2.dist-info/entry_points.txt,sha256=f9AdbBidEnMS9u_UNPlWV8LCR-8Kp_93YxVP357WdoM,41
184
+ genxai_framework-0.1.2.dist-info/top_level.txt,sha256=Jqpp4DVVrqhEJL8WeKrExKNLEX3TIWdMAr7Gm3PU9SA,11
185
+ genxai_framework-0.1.2.dist-info/RECORD,,