Riy777 commited on
Commit
cc5540e
·
verified ·
1 Parent(s): 883f8ec

Create hub_manager.py

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