aiecs 1.0.1__py3-none-any.whl → 1.7.17__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.

Potentially problematic release.


This version of aiecs might be problematic. Click here for more details.

Files changed (340) hide show
  1. aiecs/__init__.py +13 -16
  2. aiecs/__main__.py +7 -7
  3. aiecs/aiecs_client.py +269 -75
  4. aiecs/application/executors/operation_executor.py +79 -54
  5. aiecs/application/knowledge_graph/__init__.py +7 -0
  6. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  7. aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
  8. aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
  11. aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
  12. aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
  13. aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
  14. aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
  15. aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
  16. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  17. aiecs/application/knowledge_graph/extractors/base.py +98 -0
  18. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
  19. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
  20. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
  21. aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
  22. aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
  23. aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
  24. aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
  25. aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
  26. aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
  27. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
  28. aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
  29. aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
  30. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
  31. aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
  32. aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
  33. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
  34. aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
  35. aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
  36. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  37. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
  38. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
  39. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  40. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -0
  41. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  42. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  43. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +341 -0
  44. aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
  45. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -0
  46. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  47. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  48. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +913 -0
  49. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
  50. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
  51. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
  52. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
  53. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
  54. aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
  55. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
  56. aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
  57. aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
  58. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
  59. aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
  60. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  61. aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
  62. aiecs/application/knowledge_graph/search/reranker.py +293 -0
  63. aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
  64. aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
  65. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  66. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
  67. aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
  68. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  69. aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
  70. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  71. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
  72. aiecs/common/__init__.py +9 -0
  73. aiecs/common/knowledge_graph/__init__.py +17 -0
  74. aiecs/common/knowledge_graph/runnable.py +471 -0
  75. aiecs/config/__init__.py +20 -5
  76. aiecs/config/config.py +762 -31
  77. aiecs/config/graph_config.py +131 -0
  78. aiecs/config/tool_config.py +435 -0
  79. aiecs/core/__init__.py +29 -13
  80. aiecs/core/interface/__init__.py +2 -2
  81. aiecs/core/interface/execution_interface.py +22 -22
  82. aiecs/core/interface/storage_interface.py +37 -88
  83. aiecs/core/registry/__init__.py +31 -0
  84. aiecs/core/registry/service_registry.py +92 -0
  85. aiecs/domain/__init__.py +270 -1
  86. aiecs/domain/agent/__init__.py +191 -0
  87. aiecs/domain/agent/base_agent.py +3949 -0
  88. aiecs/domain/agent/exceptions.py +99 -0
  89. aiecs/domain/agent/graph_aware_mixin.py +569 -0
  90. aiecs/domain/agent/hybrid_agent.py +1731 -0
  91. aiecs/domain/agent/integration/__init__.py +29 -0
  92. aiecs/domain/agent/integration/context_compressor.py +216 -0
  93. aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
  94. aiecs/domain/agent/integration/protocols.py +281 -0
  95. aiecs/domain/agent/integration/retry_policy.py +218 -0
  96. aiecs/domain/agent/integration/role_config.py +213 -0
  97. aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
  98. aiecs/domain/agent/lifecycle.py +291 -0
  99. aiecs/domain/agent/llm_agent.py +692 -0
  100. aiecs/domain/agent/memory/__init__.py +12 -0
  101. aiecs/domain/agent/memory/conversation.py +1124 -0
  102. aiecs/domain/agent/migration/__init__.py +14 -0
  103. aiecs/domain/agent/migration/conversion.py +163 -0
  104. aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
  105. aiecs/domain/agent/models.py +894 -0
  106. aiecs/domain/agent/observability.py +479 -0
  107. aiecs/domain/agent/persistence.py +449 -0
  108. aiecs/domain/agent/prompts/__init__.py +29 -0
  109. aiecs/domain/agent/prompts/builder.py +159 -0
  110. aiecs/domain/agent/prompts/formatters.py +187 -0
  111. aiecs/domain/agent/prompts/template.py +255 -0
  112. aiecs/domain/agent/registry.py +253 -0
  113. aiecs/domain/agent/tool_agent.py +444 -0
  114. aiecs/domain/agent/tools/__init__.py +15 -0
  115. aiecs/domain/agent/tools/schema_generator.py +377 -0
  116. aiecs/domain/community/__init__.py +155 -0
  117. aiecs/domain/community/agent_adapter.py +469 -0
  118. aiecs/domain/community/analytics.py +432 -0
  119. aiecs/domain/community/collaborative_workflow.py +648 -0
  120. aiecs/domain/community/communication_hub.py +634 -0
  121. aiecs/domain/community/community_builder.py +320 -0
  122. aiecs/domain/community/community_integration.py +796 -0
  123. aiecs/domain/community/community_manager.py +803 -0
  124. aiecs/domain/community/decision_engine.py +849 -0
  125. aiecs/domain/community/exceptions.py +231 -0
  126. aiecs/domain/community/models/__init__.py +33 -0
  127. aiecs/domain/community/models/community_models.py +234 -0
  128. aiecs/domain/community/resource_manager.py +461 -0
  129. aiecs/domain/community/shared_context_manager.py +589 -0
  130. aiecs/domain/context/__init__.py +40 -10
  131. aiecs/domain/context/context_engine.py +1910 -0
  132. aiecs/domain/context/conversation_models.py +87 -53
  133. aiecs/domain/context/graph_memory.py +582 -0
  134. aiecs/domain/execution/model.py +12 -4
  135. aiecs/domain/knowledge_graph/__init__.py +19 -0
  136. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  137. aiecs/domain/knowledge_graph/models/entity.py +148 -0
  138. aiecs/domain/knowledge_graph/models/evidence.py +178 -0
  139. aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
  140. aiecs/domain/knowledge_graph/models/path.py +171 -0
  141. aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
  142. aiecs/domain/knowledge_graph/models/query.py +261 -0
  143. aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
  144. aiecs/domain/knowledge_graph/models/relation.py +202 -0
  145. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  146. aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
  147. aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
  148. aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
  149. aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
  150. aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
  151. aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
  152. aiecs/domain/task/dsl_processor.py +172 -56
  153. aiecs/domain/task/model.py +20 -8
  154. aiecs/domain/task/task_context.py +27 -24
  155. aiecs/infrastructure/__init__.py +0 -2
  156. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  157. aiecs/infrastructure/graph_storage/base.py +837 -0
  158. aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
  159. aiecs/infrastructure/graph_storage/cache.py +424 -0
  160. aiecs/infrastructure/graph_storage/distributed.py +223 -0
  161. aiecs/infrastructure/graph_storage/error_handling.py +380 -0
  162. aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
  163. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  164. aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
  165. aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
  166. aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
  167. aiecs/infrastructure/graph_storage/metrics.py +344 -0
  168. aiecs/infrastructure/graph_storage/migration.py +400 -0
  169. aiecs/infrastructure/graph_storage/pagination.py +483 -0
  170. aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
  171. aiecs/infrastructure/graph_storage/postgres.py +1563 -0
  172. aiecs/infrastructure/graph_storage/property_storage.py +353 -0
  173. aiecs/infrastructure/graph_storage/protocols.py +76 -0
  174. aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
  175. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  176. aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
  177. aiecs/infrastructure/graph_storage/streaming.py +487 -0
  178. aiecs/infrastructure/graph_storage/tenant.py +412 -0
  179. aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
  180. aiecs/infrastructure/messaging/websocket_manager.py +51 -35
  181. aiecs/infrastructure/monitoring/__init__.py +22 -0
  182. aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
  183. aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
  184. aiecs/infrastructure/monitoring/structured_logger.py +3 -7
  185. aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
  186. aiecs/infrastructure/persistence/__init__.py +14 -1
  187. aiecs/infrastructure/persistence/context_engine_client.py +184 -0
  188. aiecs/infrastructure/persistence/database_manager.py +67 -43
  189. aiecs/infrastructure/persistence/file_storage.py +180 -103
  190. aiecs/infrastructure/persistence/redis_client.py +74 -21
  191. aiecs/llm/__init__.py +73 -25
  192. aiecs/llm/callbacks/__init__.py +11 -0
  193. aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
  194. aiecs/llm/client_factory.py +230 -37
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +328 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +415 -0
  199. aiecs/llm/clients/googleai_client.py +314 -0
  200. aiecs/llm/clients/openai_client.py +158 -0
  201. aiecs/llm/clients/openai_compatible_mixin.py +367 -0
  202. aiecs/llm/clients/vertex_client.py +1186 -0
  203. aiecs/llm/clients/xai_client.py +201 -0
  204. aiecs/llm/config/__init__.py +51 -0
  205. aiecs/llm/config/config_loader.py +272 -0
  206. aiecs/llm/config/config_validator.py +206 -0
  207. aiecs/llm/config/model_config.py +143 -0
  208. aiecs/llm/protocols.py +149 -0
  209. aiecs/llm/utils/__init__.py +10 -0
  210. aiecs/llm/utils/validate_config.py +89 -0
  211. aiecs/main.py +140 -121
  212. aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
  213. aiecs/scripts/aid/__init__.py +19 -0
  214. aiecs/scripts/aid/module_checker.py +499 -0
  215. aiecs/scripts/aid/version_manager.py +235 -0
  216. aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
  217. aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
  218. aiecs/scripts/dependance_check/__init__.py +15 -0
  219. aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
  220. aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
  221. aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
  222. aiecs/scripts/dependance_patch/__init__.py +7 -0
  223. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  224. aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
  225. aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
  226. aiecs/scripts/knowledge_graph/__init__.py +3 -0
  227. aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
  228. aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
  229. aiecs/scripts/tools_develop/README.md +671 -0
  230. aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
  231. aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
  232. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  233. aiecs/scripts/tools_develop/__init__.py +21 -0
  234. aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
  235. aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
  236. aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
  237. aiecs/scripts/tools_develop/schema_coverage.py +511 -0
  238. aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
  239. aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
  240. aiecs/scripts/tools_develop/verify_tools.py +352 -0
  241. aiecs/tasks/__init__.py +0 -1
  242. aiecs/tasks/worker.py +115 -47
  243. aiecs/tools/__init__.py +194 -72
  244. aiecs/tools/apisource/__init__.py +99 -0
  245. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  246. aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
  247. aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
  248. aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
  249. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  250. aiecs/tools/apisource/monitoring/metrics.py +330 -0
  251. aiecs/tools/apisource/providers/__init__.py +112 -0
  252. aiecs/tools/apisource/providers/base.py +671 -0
  253. aiecs/tools/apisource/providers/census.py +397 -0
  254. aiecs/tools/apisource/providers/fred.py +535 -0
  255. aiecs/tools/apisource/providers/newsapi.py +409 -0
  256. aiecs/tools/apisource/providers/worldbank.py +352 -0
  257. aiecs/tools/apisource/reliability/__init__.py +12 -0
  258. aiecs/tools/apisource/reliability/error_handler.py +363 -0
  259. aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
  260. aiecs/tools/apisource/tool.py +832 -0
  261. aiecs/tools/apisource/utils/__init__.py +9 -0
  262. aiecs/tools/apisource/utils/validators.py +334 -0
  263. aiecs/tools/base_tool.py +415 -21
  264. aiecs/tools/docs/__init__.py +121 -0
  265. aiecs/tools/docs/ai_document_orchestrator.py +607 -0
  266. aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
  267. aiecs/tools/docs/content_insertion_tool.py +1320 -0
  268. aiecs/tools/docs/document_creator_tool.py +1464 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1016 -0
  271. aiecs/tools/docs/document_writer_tool.py +2008 -0
  272. aiecs/tools/knowledge_graph/__init__.py +17 -0
  273. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
  274. aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
  275. aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
  276. aiecs/tools/langchain_adapter.py +300 -138
  277. aiecs/tools/schema_generator.py +455 -0
  278. aiecs/tools/search_tool/__init__.py +100 -0
  279. aiecs/tools/search_tool/analyzers.py +581 -0
  280. aiecs/tools/search_tool/cache.py +264 -0
  281. aiecs/tools/search_tool/constants.py +128 -0
  282. aiecs/tools/search_tool/context.py +224 -0
  283. aiecs/tools/search_tool/core.py +778 -0
  284. aiecs/tools/search_tool/deduplicator.py +119 -0
  285. aiecs/tools/search_tool/error_handler.py +242 -0
  286. aiecs/tools/search_tool/metrics.py +343 -0
  287. aiecs/tools/search_tool/rate_limiter.py +172 -0
  288. aiecs/tools/search_tool/schemas.py +275 -0
  289. aiecs/tools/statistics/__init__.py +80 -0
  290. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
  291. aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
  292. aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
  293. aiecs/tools/statistics/data_loader_tool.py +555 -0
  294. aiecs/tools/statistics/data_profiler_tool.py +638 -0
  295. aiecs/tools/statistics/data_transformer_tool.py +580 -0
  296. aiecs/tools/statistics/data_visualizer_tool.py +498 -0
  297. aiecs/tools/statistics/model_trainer_tool.py +507 -0
  298. aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
  299. aiecs/tools/task_tools/__init__.py +49 -36
  300. aiecs/tools/task_tools/chart_tool.py +200 -184
  301. aiecs/tools/task_tools/classfire_tool.py +268 -267
  302. aiecs/tools/task_tools/image_tool.py +220 -141
  303. aiecs/tools/task_tools/office_tool.py +226 -146
  304. aiecs/tools/task_tools/pandas_tool.py +477 -121
  305. aiecs/tools/task_tools/report_tool.py +390 -142
  306. aiecs/tools/task_tools/research_tool.py +149 -79
  307. aiecs/tools/task_tools/scraper_tool.py +339 -145
  308. aiecs/tools/task_tools/stats_tool.py +448 -209
  309. aiecs/tools/temp_file_manager.py +26 -24
  310. aiecs/tools/tool_executor/__init__.py +18 -16
  311. aiecs/tools/tool_executor/tool_executor.py +364 -52
  312. aiecs/utils/LLM_output_structor.py +74 -48
  313. aiecs/utils/__init__.py +14 -3
  314. aiecs/utils/base_callback.py +0 -3
  315. aiecs/utils/cache_provider.py +696 -0
  316. aiecs/utils/execution_utils.py +50 -31
  317. aiecs/utils/prompt_loader.py +1 -0
  318. aiecs/utils/token_usage_repository.py +37 -11
  319. aiecs/ws/socket_server.py +14 -4
  320. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/METADATA +52 -15
  321. aiecs-1.7.17.dist-info/RECORD +337 -0
  322. aiecs-1.7.17.dist-info/entry_points.txt +13 -0
  323. aiecs/config/registry.py +0 -19
  324. aiecs/domain/context/content_engine.py +0 -982
  325. aiecs/llm/base_client.py +0 -99
  326. aiecs/llm/openai_client.py +0 -125
  327. aiecs/llm/vertex_client.py +0 -186
  328. aiecs/llm/xai_client.py +0 -184
  329. aiecs/scripts/dependency_checker.py +0 -857
  330. aiecs/scripts/quick_dependency_check.py +0 -269
  331. aiecs/tools/task_tools/search_api.py +0 -7
  332. aiecs-1.0.1.dist-info/RECORD +0 -90
  333. aiecs-1.0.1.dist-info/entry_points.txt +0 -7
  334. /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
  335. /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
  336. /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
  337. /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
  338. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,432 @@
1
+ """
2
+ Community Analytics
3
+
4
+ Tracks decision patterns, member participation, community health metrics,
5
+ and collaboration effectiveness.
6
+ """
7
+
8
+ import logging
9
+ from datetime import datetime, timedelta
10
+ from typing import Dict, Any, Optional, TYPE_CHECKING
11
+
12
+ if TYPE_CHECKING:
13
+ from .community_manager import CommunityManager
14
+ from collections import defaultdict
15
+
16
+ from .models.community_models import DecisionStatus
17
+
18
+ logger = logging.getLogger(__name__)
19
+
20
+
21
+ class CommunityAnalytics:
22
+ """
23
+ Analytics engine for tracking community health and effectiveness.
24
+ """
25
+
26
+ def __init__(self, community_manager: Optional["CommunityManager"] = None) -> None:
27
+ """
28
+ Initialize community analytics.
29
+
30
+ Args:
31
+ community_manager: Reference to the community manager
32
+ """
33
+ self.community_manager = community_manager
34
+
35
+ # Analytics caches
36
+ self._decision_patterns_cache: Dict[str, Any] = {}
37
+ self._participation_cache: Dict[str, Any] = {}
38
+ self._health_metrics_cache: Dict[str, Any] = {}
39
+
40
+ logger.info("Community analytics initialized")
41
+
42
+ def get_decision_analytics(self, community_id: str, time_range_days: int = 30) -> Dict[str, Any]:
43
+ """
44
+ Get decision analytics for a community.
45
+
46
+ Args:
47
+ community_id: ID of the community
48
+ time_range_days: Time range for analytics in days
49
+
50
+ Returns:
51
+ Decision analytics data
52
+ """
53
+ if not self.community_manager:
54
+ return {}
55
+
56
+ community = self.community_manager.communities.get(community_id)
57
+ if not community:
58
+ return {}
59
+
60
+ cutoff_date = datetime.utcnow() - timedelta(days=time_range_days)
61
+
62
+ # Collect decisions within time range
63
+ decisions = []
64
+ for decision in self.community_manager.decisions.values():
65
+ if decision.created_at >= cutoff_date:
66
+ # Check if decision belongs to this community
67
+ if decision.proposer_id in community.members:
68
+ decisions.append(decision)
69
+
70
+ # Calculate decision metrics
71
+ total_decisions = len(decisions)
72
+ approved = sum(1 for d in decisions if d.status == DecisionStatus.APPROVED)
73
+ rejected = sum(1 for d in decisions if d.status == DecisionStatus.REJECTED)
74
+ pending = sum(1 for d in decisions if d.status in [DecisionStatus.PROPOSED, DecisionStatus.VOTING])
75
+
76
+ # Calculate average time to decision
77
+ decision_times = []
78
+ for decision in decisions:
79
+ if decision.status in [
80
+ DecisionStatus.APPROVED,
81
+ DecisionStatus.REJECTED,
82
+ ]:
83
+ if decision.implemented_at or decision.created_at:
84
+ end_time = decision.implemented_at or datetime.utcnow()
85
+ duration = (end_time - decision.created_at).total_seconds() / 3600 # hours
86
+ decision_times.append(duration)
87
+
88
+ avg_decision_time = sum(decision_times) / len(decision_times) if decision_times else 0
89
+
90
+ # Decision types distribution
91
+ decision_types: Dict[str, int] = defaultdict(int)
92
+ for decision in decisions:
93
+ decision_types[decision.decision_type] += 1
94
+
95
+ # Approval rate by type
96
+ approval_by_type = {}
97
+ for dtype in decision_types.keys():
98
+ type_decisions = [d for d in decisions if d.decision_type == dtype]
99
+ type_approved = sum(1 for d in type_decisions if d.status == DecisionStatus.APPROVED)
100
+ approval_by_type[dtype] = type_approved / len(type_decisions) if type_decisions else 0
101
+
102
+ analytics = {
103
+ "community_id": community_id,
104
+ "time_range_days": time_range_days,
105
+ "total_decisions": total_decisions,
106
+ "approved": approved,
107
+ "rejected": rejected,
108
+ "pending": pending,
109
+ "approval_rate": (approved / total_decisions if total_decisions > 0 else 0),
110
+ "rejection_rate": (rejected / total_decisions if total_decisions > 0 else 0),
111
+ "average_decision_time_hours": avg_decision_time,
112
+ "decision_types": dict(decision_types),
113
+ "approval_rate_by_type": approval_by_type,
114
+ "decision_velocity": (total_decisions / time_range_days if time_range_days > 0 else 0),
115
+ }
116
+
117
+ return analytics
118
+
119
+ def get_member_participation_analytics(self, community_id: str, time_range_days: int = 30) -> Dict[str, Any]:
120
+ """
121
+ Get member participation analytics.
122
+
123
+ Args:
124
+ community_id: ID of the community
125
+ time_range_days: Time range for analytics in days
126
+
127
+ Returns:
128
+ Participation analytics data
129
+ """
130
+ if not self.community_manager:
131
+ return {}
132
+
133
+ community = self.community_manager.communities.get(community_id)
134
+ if not community:
135
+ return {}
136
+
137
+ cutoff_date = datetime.utcnow() - timedelta(days=time_range_days)
138
+
139
+ # Member participation metrics
140
+ member_metrics = {}
141
+ for member_id in community.members:
142
+ member = self.community_manager.members.get(member_id)
143
+ if not member:
144
+ continue
145
+
146
+ # Count votes
147
+ votes_cast = 0
148
+ proposals_made = 0
149
+
150
+ for decision in self.community_manager.decisions.values():
151
+ if decision.created_at >= cutoff_date:
152
+ if member_id in decision.votes_for or member_id in decision.votes_against or member_id in decision.abstentions:
153
+ votes_cast += 1
154
+ if decision.proposer_id == member_id:
155
+ proposals_made += 1
156
+
157
+ # Count resources contributed
158
+ resources_created = sum(1 for resource in self.community_manager.resources.values() if resource.owner_id == member_id and resource.created_at >= cutoff_date)
159
+
160
+ member_metrics[member_id] = {
161
+ "agent_id": member.agent_id,
162
+ "community_role": member.community_role.value,
163
+ "votes_cast": votes_cast,
164
+ "proposals_made": proposals_made,
165
+ "resources_created": resources_created,
166
+ "contribution_score": member.contribution_score,
167
+ "reputation": member.reputation,
168
+ "is_active": member.is_active,
169
+ "participation_level": member.participation_level,
170
+ }
171
+
172
+ # Calculate aggregate metrics
173
+ total_members = len(member_metrics)
174
+ active_members = sum(1 for m in member_metrics.values() if m.get("is_active", False))
175
+ total_votes = sum(int(m.get("votes_cast", 0)) for m in member_metrics.values())
176
+ total_proposals = sum(int(m.get("proposals_made", 0)) for m in member_metrics.values())
177
+ total_resources = sum(int(m.get("resources_created", 0)) for m in member_metrics.values())
178
+
179
+ # Identify top contributors
180
+ top_voters = sorted(
181
+ member_metrics.items(),
182
+ key=lambda x: x[1]["votes_cast"],
183
+ reverse=True,
184
+ )[:5]
185
+
186
+ top_proposers = sorted(
187
+ member_metrics.items(),
188
+ key=lambda x: x[1]["proposals_made"],
189
+ reverse=True,
190
+ )[:5]
191
+
192
+ top_contributors = sorted(
193
+ member_metrics.items(),
194
+ key=lambda x: x[1]["contribution_score"],
195
+ reverse=True,
196
+ )[:5]
197
+
198
+ analytics = {
199
+ "community_id": community_id,
200
+ "time_range_days": time_range_days,
201
+ "total_members": total_members,
202
+ "active_members": active_members,
203
+ "activity_rate": (active_members / total_members if total_members > 0 else 0),
204
+ "total_votes_cast": total_votes,
205
+ "total_proposals_made": total_proposals,
206
+ "total_resources_created": total_resources,
207
+ "average_votes_per_member": (total_votes / total_members if total_members > 0 else 0),
208
+ "average_proposals_per_member": (total_proposals / total_members if total_members > 0 else 0),
209
+ "member_metrics": member_metrics,
210
+ "top_voters": [{"member_id": mid, **metrics} for mid, metrics in top_voters],
211
+ "top_proposers": [{"member_id": mid, **metrics} for mid, metrics in top_proposers],
212
+ "top_contributors": [{"member_id": mid, **metrics} for mid, metrics in top_contributors],
213
+ }
214
+
215
+ return analytics
216
+
217
+ def get_community_health_metrics(self, community_id: str) -> Dict[str, Any]:
218
+ """
219
+ Get comprehensive community health metrics.
220
+
221
+ Args:
222
+ community_id: ID of the community
223
+
224
+ Returns:
225
+ Health metrics data
226
+ """
227
+ if not self.community_manager:
228
+ return {}
229
+
230
+ community = self.community_manager.communities.get(community_id)
231
+ if not community:
232
+ return {}
233
+
234
+ # Member health
235
+ total_members = len(community.members)
236
+ active_members = sum(1 for mid in community.members if self.community_manager.members.get(mid) and self.community_manager.members[mid].is_active)
237
+
238
+ # Leadership health
239
+ has_leaders = len(community.leaders) > 0
240
+ has_coordinators = len(community.coordinators) > 0
241
+ ((len(community.leaders) + len(community.coordinators)) / total_members if total_members > 0 else 0)
242
+
243
+ # Activity health
244
+ recent_activity_days = 7
245
+ recent_cutoff = datetime.utcnow() - timedelta(days=recent_activity_days)
246
+
247
+ recent_decisions = sum(1 for d in self.community_manager.decisions.values() if d.created_at >= recent_cutoff and d.proposer_id in community.members)
248
+
249
+ recent_resources = sum(1 for rid in community.shared_resources if self.community_manager.resources.get(rid) and self.community_manager.resources[rid].created_at >= recent_cutoff)
250
+
251
+ # Diversity metrics
252
+ role_distribution: Dict[str, int] = defaultdict(int)
253
+ for member_id in community.members:
254
+ member = self.community_manager.members.get(member_id)
255
+ if member:
256
+ role_distribution[member.community_role.value] += 1
257
+
258
+ role_diversity = len(role_distribution) / 5 # Max 5 role types
259
+
260
+ # Collaboration score (from community model)
261
+ collaboration_score = community.collaboration_score
262
+
263
+ # Calculate overall health score (0-100)
264
+ health_components = {
265
+ "member_activity": ((active_members / total_members * 100) if total_members > 0 else 0),
266
+ "leadership": (100 if has_leaders and has_coordinators else 50 if has_leaders or has_coordinators else 0),
267
+ "recent_activity": min((recent_decisions + recent_resources) * 10, 100),
268
+ "role_diversity": role_diversity * 100,
269
+ "collaboration": collaboration_score * 100,
270
+ }
271
+
272
+ overall_health = sum(health_components.values()) / len(health_components)
273
+
274
+ # Determine health status
275
+ if overall_health >= 80:
276
+ health_status = "excellent"
277
+ elif overall_health >= 60:
278
+ health_status = "good"
279
+ elif overall_health >= 40:
280
+ health_status = "fair"
281
+ elif overall_health >= 20:
282
+ health_status = "poor"
283
+ else:
284
+ health_status = "critical"
285
+
286
+ # Recommendations
287
+ recommendations = []
288
+ if total_members == 0:
289
+ recommendations.append("Add members to the community to begin collaboration")
290
+ elif active_members / total_members < 0.5:
291
+ recommendations.append("Increase member engagement through targeted activities")
292
+ if not has_leaders:
293
+ recommendations.append("Assign community leaders for better coordination")
294
+ if recent_decisions + recent_resources < 3:
295
+ recommendations.append("Encourage more community activity and collaboration")
296
+ if role_diversity < 0.6:
297
+ recommendations.append("Improve role diversity by adding members with different roles")
298
+
299
+ metrics = {
300
+ "community_id": community_id,
301
+ "community_name": community.name,
302
+ "overall_health_score": round(overall_health, 2),
303
+ "health_status": health_status,
304
+ "health_components": health_components,
305
+ "member_statistics": {
306
+ "total": total_members,
307
+ "active": active_members,
308
+ "inactive": total_members - active_members,
309
+ "leaders": len(community.leaders),
310
+ "coordinators": len(community.coordinators),
311
+ },
312
+ "activity_statistics": {
313
+ "recent_decisions": recent_decisions,
314
+ "recent_resources": recent_resources,
315
+ "total_decisions": community.decision_count,
316
+ "total_resources": community.resource_count,
317
+ },
318
+ "diversity_metrics": {
319
+ "role_distribution": dict(role_distribution),
320
+ "role_diversity_score": round(role_diversity, 2),
321
+ },
322
+ "collaboration_score": collaboration_score,
323
+ "recommendations": recommendations,
324
+ "timestamp": datetime.utcnow().isoformat(),
325
+ }
326
+
327
+ return metrics
328
+
329
+ def get_collaboration_effectiveness(self, community_id: str, time_range_days: int = 30) -> Dict[str, Any]:
330
+ """
331
+ Get collaboration effectiveness metrics.
332
+
333
+ Args:
334
+ community_id: ID of the community
335
+ time_range_days: Time range for analytics in days
336
+
337
+ Returns:
338
+ Collaboration effectiveness data
339
+ """
340
+ if not self.community_manager:
341
+ return {}
342
+
343
+ # Get decision and participation analytics
344
+ decision_analytics = self.get_decision_analytics(community_id, time_range_days)
345
+ participation_analytics = self.get_member_participation_analytics(community_id, time_range_days)
346
+
347
+ # Calculate effectiveness metrics
348
+ decision_efficiency = decision_analytics.get("decision_velocity", 0) * 10
349
+ approval_effectiveness = decision_analytics.get("approval_rate", 0) * 100
350
+ participation_rate = participation_analytics.get("activity_rate", 0) * 100
351
+
352
+ # Combined effectiveness score
353
+ effectiveness_score = decision_efficiency * 0.3 + approval_effectiveness * 0.4 + participation_rate * 0.3
354
+
355
+ # Determine effectiveness level
356
+ if effectiveness_score >= 80:
357
+ effectiveness_level = "highly_effective"
358
+ elif effectiveness_score >= 60:
359
+ effectiveness_level = "effective"
360
+ elif effectiveness_score >= 40:
361
+ effectiveness_level = "moderately_effective"
362
+ else:
363
+ effectiveness_level = "needs_improvement"
364
+
365
+ # Identify strengths and weaknesses
366
+ strengths = []
367
+ weaknesses = []
368
+
369
+ if decision_efficiency >= 8:
370
+ strengths.append("High decision velocity")
371
+ else:
372
+ weaknesses.append("Low decision-making speed")
373
+
374
+ if approval_effectiveness >= 70:
375
+ strengths.append("High approval rate")
376
+ else:
377
+ weaknesses.append("Low approval rate - may indicate alignment issues")
378
+
379
+ if participation_rate >= 70:
380
+ strengths.append("Strong member participation")
381
+ else:
382
+ weaknesses.append("Low member participation")
383
+
384
+ metrics = {
385
+ "community_id": community_id,
386
+ "time_range_days": time_range_days,
387
+ "effectiveness_score": round(effectiveness_score, 2),
388
+ "effectiveness_level": effectiveness_level,
389
+ "component_scores": {
390
+ "decision_efficiency": round(decision_efficiency, 2),
391
+ "approval_effectiveness": round(approval_effectiveness, 2),
392
+ "participation_rate": round(participation_rate, 2),
393
+ },
394
+ "strengths": strengths,
395
+ "weaknesses": weaknesses,
396
+ "decision_summary": {
397
+ "velocity": decision_analytics.get("decision_velocity", 0),
398
+ "approval_rate": decision_analytics.get("approval_rate", 0),
399
+ "avg_time_hours": decision_analytics.get("average_decision_time_hours", 0),
400
+ },
401
+ "participation_summary": {
402
+ "active_members": participation_analytics.get("active_members", 0),
403
+ "total_members": participation_analytics.get("total_members", 0),
404
+ "avg_votes_per_member": participation_analytics.get("average_votes_per_member", 0),
405
+ },
406
+ "timestamp": datetime.utcnow().isoformat(),
407
+ }
408
+
409
+ return metrics
410
+
411
+ def get_comprehensive_report(self, community_id: str, time_range_days: int = 30) -> Dict[str, Any]:
412
+ """
413
+ Get comprehensive analytics report for a community.
414
+
415
+ Args:
416
+ community_id: ID of the community
417
+ time_range_days: Time range for analytics in days
418
+
419
+ Returns:
420
+ Comprehensive analytics report
421
+ """
422
+ report = {
423
+ "community_id": community_id,
424
+ "report_date": datetime.utcnow().isoformat(),
425
+ "time_range_days": time_range_days,
426
+ "decision_analytics": self.get_decision_analytics(community_id, time_range_days),
427
+ "participation_analytics": self.get_member_participation_analytics(community_id, time_range_days),
428
+ "health_metrics": self.get_community_health_metrics(community_id),
429
+ "collaboration_effectiveness": self.get_collaboration_effectiveness(community_id, time_range_days),
430
+ }
431
+
432
+ return report