aiecs 1.5.1__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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. aiecs-1.5.1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,268 @@
1
+ import time
2
+ import logging
3
+ import json
4
+ from typing import Dict, Any, Optional, AsyncGenerator, List
5
+ from contextlib import asynccontextmanager
6
+ from dataclasses import dataclass
7
+ from pathlib import Path
8
+
9
+ logger = logging.getLogger(__name__)
10
+
11
+
12
+ @dataclass
13
+ class ContextUpdate:
14
+ """Represents a single update to the context (e.g., message, metadata, or resource)."""
15
+
16
+ timestamp: float
17
+ update_type: str # e.g., "message", "metadata", "resource"
18
+ data: Any # Content of the update (e.g., message text, metadata dict)
19
+ # Additional metadata (e.g., file paths, model info)
20
+ metadata: Dict[str, Any]
21
+
22
+
23
+ class TaskContext:
24
+ """
25
+ Enhanced context manager for task execution with:
26
+ - Context history tracking and checkpointing
27
+ - Resource acquisition and release
28
+ - Performance tracking
29
+ - File and model tracking
30
+ - Persistent storage
31
+ - Metadata toggles
32
+ - Enhanced error handling
33
+ """
34
+
35
+ def __init__(self, data: dict, task_dir: str = "./tasks"):
36
+ self.user_id = data.get("user_id", "anonymous")
37
+ self.chat_id = data.get("chat_id", "none")
38
+ # Ensure metadata includes aiPreference
39
+ self.metadata = data.get("metadata", {})
40
+ if "aiPreference" in data:
41
+ self.metadata["aiPreference"] = data["aiPreference"]
42
+ self.task_dir = Path(task_dir)
43
+ self.start_time: Optional[float] = None
44
+ self.resources: Dict[str, Any] = {}
45
+ self.context_history: List[ContextUpdate] = []
46
+ # Tracks file operations
47
+ self.file_tracker: Dict[str, Dict[str, Any]] = {}
48
+ self.model_tracker: List[Dict[str, Any]] = [] # Tracks model usage
49
+ self.metadata_toggles: Dict[str, bool] = data.get("metadata_toggles", {})
50
+ self._initialize_persistence()
51
+
52
+ def _initialize_persistence(self):
53
+ """Initialize persistent storage for context history."""
54
+ try:
55
+ self.task_dir.mkdir(parents=True, exist_ok=True)
56
+ history_file = self.task_dir / f"context_history_{self.chat_id}.json"
57
+ if history_file.exists():
58
+ with open(history_file, "r") as f:
59
+ raw_history = json.load(f)
60
+ self.context_history = [
61
+ ContextUpdate(
62
+ timestamp=entry["timestamp"],
63
+ update_type=entry["update_type"],
64
+ data=entry["data"],
65
+ metadata=entry["metadata"],
66
+ )
67
+ for entry in raw_history
68
+ ]
69
+ logger.debug(f"Loaded context history from {history_file}")
70
+ except Exception as e:
71
+ logger.error(f"Failed to initialize context history: {e}")
72
+
73
+ async def _save_context_history(self):
74
+ """Save context history to disk."""
75
+ try:
76
+ history_file = self.task_dir / f"context_history_{self.chat_id}.json"
77
+ serialized_history = [
78
+ {
79
+ "timestamp": update.timestamp,
80
+ "update_type": update.update_type,
81
+ "data": update.data,
82
+ "metadata": update.metadata,
83
+ }
84
+ for update in self.context_history
85
+ ]
86
+ with open(history_file, "w") as f:
87
+ json.dump(serialized_history, f, indent=2)
88
+ logger.debug(f"Saved context history to {history_file}")
89
+ except Exception as e:
90
+ logger.error(f"Failed to save context history: {e}")
91
+
92
+ def add_context_update(self, update_type: str, data: Any, metadata: Dict[str, Any] = None):
93
+ """Add a context update (e.g., message, metadata change)."""
94
+ update = ContextUpdate(
95
+ timestamp=time.time(),
96
+ update_type=update_type,
97
+ data=data,
98
+ metadata=metadata or {},
99
+ )
100
+ self.context_history.append(update)
101
+ logger.debug(f"Added context update: {update_type}")
102
+
103
+ def add_resource(self, name: str, resource: Any) -> None:
104
+ """Add a resource that needs cleanup."""
105
+ self.resources[name] = resource
106
+ self.add_context_update("resource", {"name": name}, {"type": type(resource).__name__})
107
+ logger.debug(f"Added resource: {name}")
108
+
109
+ def track_file_operation(self, file_path: str, operation: str, source: str = "task"):
110
+ """Track a file operation (e.g., read, edit)."""
111
+ self.file_tracker[file_path] = {
112
+ "operation": operation,
113
+ "source": source,
114
+ "timestamp": time.time(),
115
+ "state": "active",
116
+ }
117
+ self.add_context_update(
118
+ "file_operation",
119
+ {"path": file_path, "operation": operation},
120
+ {"source": source},
121
+ )
122
+ logger.debug(f"Tracked file operation: {operation} on {file_path}")
123
+
124
+ def track_model_usage(self, model_id: str, provider_id: str, mode: str):
125
+ """Track AI model usage."""
126
+ model_entry = {
127
+ "model_id": model_id,
128
+ "provider_id": provider_id,
129
+ "mode": mode,
130
+ "timestamp": time.time(),
131
+ }
132
+ # Avoid duplicates
133
+ if not self.model_tracker or self.model_tracker[-1] != model_entry:
134
+ self.model_tracker.append(model_entry)
135
+ self.add_context_update("model_usage", model_entry)
136
+ logger.debug(f"Tracked model usage: {model_id} ({provider_id}, {mode})")
137
+
138
+ def optimize_context(self, max_size: int = 1000) -> bool:
139
+ """Optimize context by removing duplicates and old entries."""
140
+ deduplicated = {}
141
+ optimized_history = []
142
+ total_size = 0
143
+
144
+ for update in reversed(self.context_history):
145
+ key = f"{update.update_type}:{json.dumps(update.data, sort_keys=True)}"
146
+ if key not in deduplicated:
147
+ deduplicated[key] = update
148
+ data_size = len(str(update.data))
149
+ if total_size + data_size <= max_size:
150
+ optimized_history.append(update)
151
+ total_size += data_size
152
+
153
+ self.context_history = list(reversed(optimized_history))
154
+ if len(deduplicated) < len(self.context_history):
155
+ logger.debug(
156
+ f"Optimized context: removed {len(self.context_history) - len(deduplicated)} duplicates"
157
+ )
158
+ return True
159
+ return False
160
+
161
+ async def truncate_context_history(self, timestamp: float):
162
+ """Truncate context history after a given timestamp."""
163
+ original_len = len(self.context_history)
164
+ self.context_history = [
165
+ update for update in self.context_history if update.timestamp <= timestamp
166
+ ]
167
+ if len(self.context_history) < original_len:
168
+ await self._save_context_history()
169
+ logger.debug(f"Truncated context history at timestamp {timestamp}")
170
+
171
+ def get_active_metadata(self) -> Dict[str, Any]:
172
+ """Return metadata filtered by toggles."""
173
+ return {
174
+ key: value
175
+ for key, value in self.metadata.items()
176
+ if key not in self.metadata_toggles or self.metadata_toggles[key] is not False
177
+ }
178
+
179
+ def to_dict(self) -> Dict[str, Any]:
180
+ """Convert context to dictionary."""
181
+ return {
182
+ "user_id": self.user_id,
183
+ "chat_id": self.chat_id,
184
+ "metadata": self.get_active_metadata(),
185
+ "context_history": [
186
+ {
187
+ "timestamp": update.timestamp,
188
+ "update_type": update.update_type,
189
+ "data": update.data,
190
+ "metadata": update.metadata,
191
+ }
192
+ for update in self.context_history
193
+ ],
194
+ "file_tracker": self.file_tracker,
195
+ "model_tracker": self.model_tracker,
196
+ }
197
+
198
+ def __enter__(self):
199
+ """Synchronous context entry."""
200
+ self.start_time = time.time()
201
+ logger.debug(f"Starting task context for user {self.user_id}, chat {self.chat_id}")
202
+ return self
203
+
204
+ def __exit__(self, exc_type, exc_val, exc_tb):
205
+ """Synchronous context exit with cleanup."""
206
+ duration = time.time() - self.start_time
207
+ logger.debug(f"Completed task context in {duration:.2f}s for user {self.user_id}")
208
+ for resource_name, resource in self.resources.items():
209
+ try:
210
+ if hasattr(resource, "close"):
211
+ resource.close()
212
+ logger.debug(f"Cleaned up resource: {resource_name}")
213
+ except Exception as e:
214
+ logger.error(f"Error cleaning up resource {resource_name}: {e}")
215
+ if exc_type:
216
+ logger.error(f"Task context exited with error: {exc_val}")
217
+ return False
218
+
219
+ async def __aenter__(self):
220
+ """Asynchronous context entry."""
221
+ self.start_time = time.time()
222
+ logger.debug(f"Starting async task context for user {self.user_id}, chat {self.chat_id}")
223
+ return self
224
+
225
+ async def __aexit__(self, exc_type, exc_val, exc_tb):
226
+ """Asynchronous context exit with cleanup."""
227
+ duration = time.time() - self.start_time
228
+ logger.debug(f"Completed async task context in {duration:.2f}s for user {self.user_id}")
229
+ for resource_name, resource in self.resources.items():
230
+ try:
231
+ if hasattr(resource, "close"):
232
+ if callable(getattr(resource, "close")):
233
+ if hasattr(resource.close, "__await__"):
234
+ await resource.close()
235
+ else:
236
+ resource.close()
237
+ logger.debug(f"Cleaned up async resource: {resource_name}")
238
+ except Exception as e:
239
+ logger.error(f"Error cleaning up async resource {resource_name}: {e}")
240
+ if exc_type:
241
+ logger.error(f"Async task context exited with error: {exc_val}")
242
+ await self._save_context_history()
243
+ return False
244
+
245
+
246
+ def build_context(data: dict) -> dict:
247
+ """Build a simple context dictionary (for backward compatibility)."""
248
+ context = TaskContext(data)
249
+ return context.to_dict()
250
+
251
+
252
+ @asynccontextmanager
253
+ async def task_context(data: dict, task_dir: str = "./tasks") -> AsyncGenerator[TaskContext, None]:
254
+ """
255
+ Async context manager for task execution.
256
+
257
+ Usage:
258
+ async with task_context(request_data, task_dir="/path/to/tasks") as context:
259
+ context.add_context_update("message", "User input", {"source": "user"})
260
+ context.track_file_operation("example.py", "read", "tool")
261
+ result = await service_instance.run(data, context)
262
+ """
263
+ context = TaskContext(data, task_dir)
264
+ try:
265
+ await context.__aenter__()
266
+ yield context
267
+ finally:
268
+ await context.__aexit__(None, None, None)
@@ -0,0 +1,24 @@
1
+ """Infrastructure layer module
2
+
3
+ Contains external system integrations and technical concerns.
4
+ """
5
+
6
+ from .messaging.celery_task_manager import CeleryTaskManager
7
+ from .messaging.websocket_manager import WebSocketManager, UserConfirmation
8
+ from .persistence.database_manager import DatabaseManager
9
+ from .persistence.redis_client import RedisClient
10
+ from .monitoring.executor_metrics import ExecutorMetrics
11
+ from .monitoring.tracing_manager import TracingManager
12
+
13
+ __all__ = [
14
+ # Messaging
15
+ "CeleryTaskManager",
16
+ "WebSocketManager",
17
+ "UserConfirmation",
18
+ # Persistence
19
+ "DatabaseManager",
20
+ "RedisClient",
21
+ # Monitoring
22
+ "ExecutorMetrics",
23
+ "TracingManager",
24
+ ]
@@ -0,0 +1,11 @@
1
+ from aiecs.infrastructure.graph_storage.base import GraphStore
2
+ from aiecs.infrastructure.graph_storage.in_memory import InMemoryGraphStore
3
+ from aiecs.infrastructure.graph_storage.sqlite import SQLiteGraphStore
4
+ from aiecs.infrastructure.graph_storage.postgres import PostgresGraphStore
5
+
6
+ __all__ = [
7
+ "GraphStore",
8
+ "InMemoryGraphStore",
9
+ "SQLiteGraphStore",
10
+ "PostgresGraphStore",
11
+ ]