Spaces:
Paused
Paused
Update r2.py
Browse files
r2.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
# ==============================================================================
|
| 2 |
-
# ☁️ r2.py (
|
| 3 |
# ==============================================================================
|
| 4 |
|
| 5 |
import os
|
|
@@ -45,6 +45,10 @@ DEEP_STEWARD_AUDIT_KEY = "DeepSteward_Audit_Log.json"
|
|
| 45 |
# ✅ مفتاح جديد خاص ببيانات تدريب الحوكمة (156 مؤشر + النتيجة)
|
| 46 |
GOVERNANCE_TRAINING_KEY = "datasets/governance_training_data.json"
|
| 47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
# 🧬 مفاتيح النظام السيبراني
|
| 49 |
STRATEGIC_DNA_KEY = "learning/strategic_dna_v2.json"
|
| 50 |
|
|
@@ -65,6 +69,7 @@ class R2Service:
|
|
| 65 |
)
|
| 66 |
self.lock_acquired = False
|
| 67 |
self.BUCKET_NAME = BUCKET_NAME
|
|
|
|
| 68 |
|
| 69 |
except Exception as e:
|
| 70 |
raise RuntimeError(f"Failed to initialize S3 client: {e}")
|
|
@@ -122,6 +127,10 @@ class R2Service:
|
|
| 122 |
|
| 123 |
await asyncio.to_thread(_reset_sync)
|
| 124 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 125 |
print("✅ [R2 Reset] تم تصفير جميع البيانات والمحفظة بنجاح.")
|
| 126 |
return True
|
| 127 |
|
|
@@ -172,6 +181,78 @@ class R2Service:
|
|
| 172 |
print(f"❌ [R2] File upload failed for {key}: {e}")
|
| 173 |
raise
|
| 174 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 175 |
# ==============================================================================
|
| 176 |
# 🏛️ بيانات تدريب الحوكمة (Governance Training Data)
|
| 177 |
# ==============================================================================
|
|
@@ -350,6 +431,4 @@ class R2Service:
|
|
| 350 |
|
| 351 |
async def load_whale_learning_config_async(self) -> Dict[str, Any]:
|
| 352 |
data = await self.get_file_async(WHALE_LEARNING_CONFIG_KEY)
|
| 353 |
-
return json.loads(data) if data else {}
|
| 354 |
-
|
| 355 |
-
print("✅ [R2 V37.1] Service Loaded (Governance Data Ready).")
|
|
|
|
| 1 |
# ==============================================================================
|
| 2 |
+
# ☁️ r2.py (V38.0 - GEM-Architect: Diagnostic Matrix & Guardian Persistence)
|
| 3 |
# ==============================================================================
|
| 4 |
|
| 5 |
import os
|
|
|
|
| 45 |
# ✅ مفتاح جديد خاص ببيانات تدريب الحوكمة (156 مؤشر + النتيجة)
|
| 46 |
GOVERNANCE_TRAINING_KEY = "datasets/governance_training_data.json"
|
| 47 |
|
| 48 |
+
# 📊 مفاتيح التحليلات والتشخيص (جديد)
|
| 49 |
+
DIAGNOSTIC_STATS_KEY = "analytics/model_diagnostic_matrix.json"
|
| 50 |
+
GUARDIAN_STATS_KEY = "analytics/guardian_performance_stats.json"
|
| 51 |
+
|
| 52 |
# 🧬 مفاتيح النظام السيبراني
|
| 53 |
STRATEGIC_DNA_KEY = "learning/strategic_dna_v2.json"
|
| 54 |
|
|
|
|
| 69 |
)
|
| 70 |
self.lock_acquired = False
|
| 71 |
self.BUCKET_NAME = BUCKET_NAME
|
| 72 |
+
print(f"✅ [R2 V38.0] Service Loaded (Diagnostics Ready).")
|
| 73 |
|
| 74 |
except Exception as e:
|
| 75 |
raise RuntimeError(f"Failed to initialize S3 client: {e}")
|
|
|
|
| 127 |
|
| 128 |
await asyncio.to_thread(_reset_sync)
|
| 129 |
|
| 130 |
+
# تصفير المصفوفات أيضاً عند الطلب الشامل
|
| 131 |
+
await self.reset_diagnostic_stats_async()
|
| 132 |
+
await self.reset_guardian_stats_async()
|
| 133 |
+
|
| 134 |
print("✅ [R2 Reset] تم تصفير جميع البيانات والمحفظة بنجاح.")
|
| 135 |
return True
|
| 136 |
|
|
|
|
| 181 |
print(f"❌ [R2] File upload failed for {key}: {e}")
|
| 182 |
raise
|
| 183 |
|
| 184 |
+
# ==============================================================================
|
| 185 |
+
# 📊 Diagnostic & Guardian Stats (New Feature)
|
| 186 |
+
# ==============================================================================
|
| 187 |
+
async def get_diagnostic_stats_async(self) -> Dict[str, Any]:
|
| 188 |
+
"""استرجاع مصفوفة التشخيص"""
|
| 189 |
+
try:
|
| 190 |
+
data = await self.get_file_async(DIAGNOSTIC_STATS_KEY)
|
| 191 |
+
defaults = {
|
| 192 |
+
"Titan": {"wins": 0, "losses": 0, "pnl": 0.0},
|
| 193 |
+
"Patterns": {"wins": 0, "losses": 0, "pnl": 0.0},
|
| 194 |
+
"Oracle": {"wins": 0, "losses": 0, "pnl": 0.0},
|
| 195 |
+
"Sniper": {"wins": 0, "losses": 0, "pnl": 0.0},
|
| 196 |
+
"MonteCarlo_L": {"wins": 0, "losses": 0, "pnl": 0.0},
|
| 197 |
+
"MonteCarlo_A": {"wins": 0, "losses": 0, "pnl": 0.0},
|
| 198 |
+
"Governance": {"wins": 0, "losses": 0, "pnl": 0.0}
|
| 199 |
+
}
|
| 200 |
+
loaded = json.loads(data) if data else {}
|
| 201 |
+
# دمج القيم الافتراضية لضمان وجود المفاتيح
|
| 202 |
+
for k, v in defaults.items():
|
| 203 |
+
if k not in loaded: loaded[k] = v
|
| 204 |
+
return loaded
|
| 205 |
+
except: return {}
|
| 206 |
+
|
| 207 |
+
async def update_diagnostic_stats_async(self, updates: Dict[str, Dict[str, float]]):
|
| 208 |
+
"""تحديث إحصائيات النماذج بشكل آمن"""
|
| 209 |
+
try:
|
| 210 |
+
current = await self.get_diagnostic_stats_async()
|
| 211 |
+
for model, metrics in updates.items():
|
| 212 |
+
if model not in current: current[model] = {"wins": 0, "losses": 0, "pnl": 0.0}
|
| 213 |
+
current[model]['wins'] += metrics.get('wins', 0)
|
| 214 |
+
current[model]['losses'] += metrics.get('losses', 0)
|
| 215 |
+
current[model]['pnl'] += metrics.get('pnl', 0.0)
|
| 216 |
+
|
| 217 |
+
await self.upload_json_async(current, DIAGNOSTIC_STATS_KEY)
|
| 218 |
+
except Exception as e:
|
| 219 |
+
print(f"❌ [R2] Failed to update diagnostics: {e}")
|
| 220 |
+
|
| 221 |
+
async def reset_diagnostic_stats_async(self):
|
| 222 |
+
"""تصفير مصفوفة التشخيص"""
|
| 223 |
+
empty = {k: {"wins": 0, "losses": 0, "pnl": 0.0} for k in
|
| 224 |
+
["Titan", "Patterns", "Oracle", "Sniper", "MonteCarlo_L", "MonteCarlo_A", "Governance"]}
|
| 225 |
+
await self.upload_json_async(empty, DIAGNOSTIC_STATS_KEY)
|
| 226 |
+
print("📊 [R2] Diagnostic Matrix Reset.")
|
| 227 |
+
|
| 228 |
+
# --- Guardian Stats ---
|
| 229 |
+
async def get_guardian_stats_async(self) -> Dict[str, Any]:
|
| 230 |
+
data = await self.get_file_async(GUARDIAN_STATS_KEY)
|
| 231 |
+
defaults = {
|
| 232 |
+
"hybrid": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0},
|
| 233 |
+
"crash": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0},
|
| 234 |
+
"giveback": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0},
|
| 235 |
+
"stagnation": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0}
|
| 236 |
+
}
|
| 237 |
+
loaded = json.loads(data) if data else {}
|
| 238 |
+
for k, v in defaults.items():
|
| 239 |
+
if k not in loaded: loaded[k] = v
|
| 240 |
+
return loaded
|
| 241 |
+
|
| 242 |
+
async def save_guardian_stats_async(self, stats: Dict[str, Any]):
|
| 243 |
+
await self.upload_json_async(stats, GUARDIAN_STATS_KEY)
|
| 244 |
+
|
| 245 |
+
async def reset_guardian_stats_async(self):
|
| 246 |
+
"""تصفير إحصائيات الحراس"""
|
| 247 |
+
defaults = {
|
| 248 |
+
"hybrid": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0},
|
| 249 |
+
"crash": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0},
|
| 250 |
+
"giveback": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0},
|
| 251 |
+
"stagnation": {"total": 0, "good": 0, "saved": 0.0, "missed": 0.0}
|
| 252 |
+
}
|
| 253 |
+
await self.upload_json_async(defaults, GUARDIAN_STATS_KEY)
|
| 254 |
+
print("🛡️ [R2] Guardian Stats Reset.")
|
| 255 |
+
|
| 256 |
# ==============================================================================
|
| 257 |
# 🏛️ بيانات تدريب الحوكمة (Governance Training Data)
|
| 258 |
# ==============================================================================
|
|
|
|
| 431 |
|
| 432 |
async def load_whale_learning_config_async(self) -> Dict[str, Any]:
|
| 433 |
data = await self.get_file_async(WHALE_LEARNING_CONFIG_KEY)
|
| 434 |
+
return json.loads(data) if data else {}
|
|
|
|
|
|