Spaces:
Running
Running
File size: 6,303 Bytes
3031827 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# learning_hub/hub_manager.py
import asyncio
from typing import Any, Dict
# (استيراد جميع المكونات الداخلية للمركز)
from .schemas import *
from .policy_engine import PolicyEngine
from .memory_store import MemoryStore
from .statistical_analyzer import StatisticalAnalyzer
from .reflector import Reflector
from .curator import Curator
class LearningHubManager:
def __init__(self, r2_service: Any, llm_service: Any, data_manager: Any):
print("🚀 Initializing Learning Hub Manager...")
# 1. الخدمات الأساسية (يتم تمريرها من app.py)
self.r2_service = r2_service
self.llm_service = llm_service
self.data_manager = data_manager
# 2. تهيئة المكونات (بناء النظام)
self.policy_engine = PolicyEngine()
self.memory_store = MemoryStore(
r2_service=self.r2_service,
policy_engine=self.policy_engine,
llm_service=self.llm_service
)
self.reflector = Reflector(
llm_service=self.llm_service,
memory_store=self.memory_store
)
self.curator = Curator(
llm_service=self.llm_service,
memory_store=self.memory_store
)
self.statistical_analyzer = StatisticalAnalyzer(
r2_service=self.r2_service,
data_manager=self.data_manager
)
self.initialized = False
print("✅ Learning Hub Manager constructed. Ready for initialization.")
async def initialize(self):
"""
تهيئة جميع الأنظمة الفرعية، وخاصة تحميل الإحصائيات والأوزان.
"""
if self.initialized:
return
print("🔄 [HubManager] Initializing all sub-modules...")
await self.statistical_analyzer.initialize()
self.initialized = True
print("✅ [HubManager] All sub-modules initialized. Learning Hub is LIVE.")
async def analyze_trade_and_learn(self, trade_object: Dict[str, Any], close_reason: str):
"""
هذه هي الدالة الرئيسية التي يستدعيها TradeManager.
إنها تشغل كلاً من نظام التعلم السريع (Reflector) والبطيء (StatsAnalyzer).
"""
if not self.initialized:
print("⚠️ [HubManager] Learning Hub not initialized. Skipping learning.")
return
print(f"🧠 [HubManager] Learning from trade {trade_object.get('symbol')}...")
try:
# 1. التعلم السريع (Reflector):
await self.reflector.analyze_trade_outcome(trade_object, close_reason)
except Exception as e:
print(f"❌ [HubManager] Reflector (Fast-Learner) failed: {e}")
try:
# 2. التعلم البطيء (StatisticalAnalyzer):
await self.statistical_analyzer.update_statistics(trade_object, close_reason)
except Exception as e:
print(f"❌ [HubManager] StatisticalAnalyzer (Slow-Learner) failed: {e}")
print(f"✅ [HubManager] Learning complete for {trade_object.get('symbol')}.")
async def get_active_context_for_llm(self, domain: str, query: str) -> str:
"""
يُستخدم بواسطة LLMService لجلب "الدفتر" (Playbook) / القواعد (Deltas).
"""
if not self.initialized:
return "Learning Hub not initialized."
return await self.memory_store.get_active_context(domain, query)
async def get_statistical_feedback_for_llm(self, entry_strategy: str) -> str:
"""
يُستخدم بواسطة LLMService لجلب أفضل ملف خروج (إحصائياً).
"""
if not self.initialized:
return "Learning Hub not initialized."
best_profile = await self.statistical_analyzer.get_best_exit_profile(entry_strategy)
if best_profile != "unknown":
# (Prompt in English as requested)
feedback = f"Statistical Feedback: For the '{entry_strategy}' strategy, the '{best_profile}' exit profile has historically performed best."
return feedback
else:
return "No statistical feedback available for this strategy yet."
async def get_optimized_weights(self, market_condition: str) -> Dict[str, float]:
"""
يُستخدم بواسطة MLProcessor/StrategyEngine لجلب الأوزان المعدلة إحصائياً.
"""
if not self.initialized:
defaults = await self.statistical_analyzer.get_default_strategy_weights()
return defaults.get("strategy_weights", {})
return await self.statistical_analyzer.get_optimized_strategy_weights(market_condition)
async def run_distillation_check(self):
"""
(يتم استدعاؤها دورياً من app.py)
للتحقق من جميع المجالات وتشغيل التقطير إذا لزم الأمر.
"""
if not self.initialized:
return
print("ℹ️ [HubManager] Running periodic distillation check...")
for domain in self.memory_store.domain_files.keys():
await self.curator.check_and_distill_domain(domain)
print("✅ [HubManager] Distillation check complete.")
# 🔴 --- START OF CHANGE --- 🔴
# (New function to save all data on shutdown)
async def shutdown(self):
"""
Saves all persistent data from the statistical analyzer.
"""
if not self.initialized:
return
print("🔄 [HubManager] Shutting down... Saving all learning data.")
try:
await self.statistical_analyzer.save_weights_to_r2()
await self.statistical_analyzer.save_performance_history()
await self.statistical_analyzer.save_exit_profile_effectiveness()
print("✅ [HubManager] All statistical (slow-learner) data saved.")
except Exception as e:
print(f"❌ [HubManager] Failed to save learning data on shutdown: {e}")
# 🔴 --- END OF CHANGE --- 🔴 |