aiecs 1.0.1__py3-none-any.whl → 1.7.6__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 +399 -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 +3870 -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 +1435 -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 +884 -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 +364 -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 +224 -36
  195. aiecs/llm/client_resolver.py +155 -0
  196. aiecs/llm/clients/__init__.py +38 -0
  197. aiecs/llm/clients/base_client.py +324 -0
  198. aiecs/llm/clients/google_function_calling_mixin.py +457 -0
  199. aiecs/llm/clients/googleai_client.py +241 -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 +897 -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 +1323 -0
  269. aiecs/tools/docs/document_layout_tool.py +1160 -0
  270. aiecs/tools/docs/document_parser_tool.py +1011 -0
  271. aiecs/tools/docs/document_writer_tool.py +1829 -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 +175 -131
  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.6.dist-info}/METADATA +52 -15
  321. aiecs-1.7.6.dist-info/RECORD +337 -0
  322. aiecs-1.7.6.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.6.dist-info}/WHEEL +0 -0
  339. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/licenses/LICENSE +0 -0
  340. {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,796 @@
1
+ """
2
+ Community Integration Module
3
+
4
+ Integrates community collaboration features with the existing agent system,
5
+ providing seamless community-aware agent management and collaboration.
6
+ """
7
+
8
+ import logging
9
+ from typing import Dict, List, Any, Optional, TYPE_CHECKING
10
+
11
+ if TYPE_CHECKING:
12
+ from aiecs.domain.context.context_engine import ContextEngine
13
+ from datetime import datetime, timedelta
14
+ from contextlib import asynccontextmanager
15
+ import asyncio
16
+
17
+ from .community_manager import CommunityManager
18
+ from .decision_engine import DecisionEngine, ConsensusAlgorithm
19
+ from .resource_manager import ResourceManager
20
+ from .collaborative_workflow import CollaborativeWorkflowEngine
21
+ from .models.community_models import CommunityRole, GovernanceType
22
+ from .exceptions import CommunityValidationError as TaskValidationError
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+
27
+ class CommunityIntegration:
28
+ """
29
+ Integration layer for community collaboration features.
30
+ """
31
+
32
+ def __init__(
33
+ self,
34
+ agent_manager: Optional[Any] = None,
35
+ context_engine: Optional["ContextEngine"] = None,
36
+ ) -> None:
37
+ """
38
+ Initialize community integration.
39
+
40
+ Args:
41
+ agent_manager: Reference to the agent manager
42
+ context_engine: Context engine for persistent storage
43
+ """
44
+ self.agent_manager = agent_manager
45
+ self.context_engine = context_engine
46
+
47
+ # Initialize community components
48
+ self.community_manager = CommunityManager(context_engine)
49
+ self.decision_engine = DecisionEngine(self.community_manager)
50
+ self.resource_manager = ResourceManager(self.community_manager, context_engine)
51
+ self.workflow_engine = CollaborativeWorkflowEngine(self.community_manager, self.resource_manager, self.decision_engine)
52
+
53
+ # Community-aware agent tracking
54
+ # agent_id -> community_ids
55
+ self.agent_community_mapping: Dict[str, List[str]] = {}
56
+ # community_id -> agent_ids
57
+ self.community_agent_mapping: Dict[str, List[str]] = {}
58
+
59
+ self._initialized = False
60
+ logger.info("Community integration initialized")
61
+
62
+ async def initialize(self) -> None:
63
+ """Initialize all community components."""
64
+ if self._initialized:
65
+ return
66
+
67
+ await self.community_manager.initialize()
68
+ self._initialized = True
69
+ logger.info("Community integration initialization completed")
70
+
71
+ async def create_agent_community(
72
+ self,
73
+ name: str,
74
+ description: str,
75
+ agent_roles: List[str],
76
+ governance_type: GovernanceType = GovernanceType.DEMOCRATIC,
77
+ creator_agent_id: Optional[str] = None,
78
+ ) -> str:
79
+ """
80
+ Create a new agent community with specified agent roles.
81
+
82
+ Args:
83
+ name: Name of the community
84
+ description: Description of the community
85
+ agent_roles: List of agent roles to include
86
+ governance_type: Type of governance
87
+ creator_agent_id: ID of the creating agent
88
+
89
+ Returns:
90
+ Community ID
91
+ """
92
+ # Create the community
93
+ community_id = await self.community_manager.create_community(
94
+ name=name,
95
+ description=description,
96
+ governance_type=governance_type,
97
+ creator_agent_id=creator_agent_id,
98
+ )
99
+
100
+ # Add agents to the community if agent_manager is available
101
+ if self.agent_manager:
102
+ for role in agent_roles:
103
+ # Get agents with this role from agent manager
104
+ agents = self.agent_manager.agent_registry.get_agents_by_role(role)
105
+
106
+ for agent in agents:
107
+ await self._add_agent_to_community(community_id, agent.agent_id, role)
108
+ else:
109
+ # For testing or when agent_manager is not available, just log the
110
+ # roles
111
+ logger.debug(f"Agent manager not available, community created without auto-adding agents for roles: {agent_roles}")
112
+
113
+ logger.info(f"Created agent community '{name}' with {len(agent_roles)} role types")
114
+ return community_id
115
+
116
+ async def _add_agent_to_community(
117
+ self,
118
+ community_id: str,
119
+ agent_id: str,
120
+ agent_role: str,
121
+ community_role: CommunityRole = CommunityRole.CONTRIBUTOR,
122
+ ) -> str:
123
+ """Add an agent to a community."""
124
+ # Add to community manager
125
+ member_id = await self.community_manager.add_member_to_community(
126
+ community_id=community_id,
127
+ agent_id=agent_id,
128
+ agent_role=agent_role,
129
+ community_role=community_role,
130
+ )
131
+
132
+ # Update mappings
133
+ if agent_id not in self.agent_community_mapping:
134
+ self.agent_community_mapping[agent_id] = []
135
+ self.agent_community_mapping[agent_id].append(community_id)
136
+
137
+ if community_id not in self.community_agent_mapping:
138
+ self.community_agent_mapping[community_id] = []
139
+ self.community_agent_mapping[community_id].append(agent_id)
140
+
141
+ return member_id
142
+
143
+ async def initiate_community_collaboration(
144
+ self,
145
+ community_id: str,
146
+ collaboration_type: str,
147
+ purpose: str,
148
+ leader_agent_id: Optional[str] = None,
149
+ specific_participants: Optional[List[str]] = None,
150
+ session_config: Optional[Dict[str, Any]] = None,
151
+ ) -> str:
152
+ """
153
+ Initiate a collaborative session within a community.
154
+
155
+ Args:
156
+ community_id: ID of the community
157
+ collaboration_type: Type of collaboration (brainstorming, problem_solving, etc.)
158
+ purpose: Purpose of the collaboration
159
+ leader_agent_id: Optional leader agent ID
160
+ specific_participants: Optional specific participants
161
+ session_config: Optional session configuration
162
+
163
+ Returns:
164
+ Session ID
165
+ """
166
+ community = self.community_manager.communities.get(community_id)
167
+ if not community:
168
+ raise TaskValidationError(f"Community not found: {community_id}")
169
+
170
+ # Determine participants
171
+ if specific_participants:
172
+ participants = specific_participants
173
+ else:
174
+ # Use all community members
175
+ participants = community.members
176
+
177
+ # Determine leader
178
+ if not leader_agent_id:
179
+ # Use first leader or coordinator
180
+ if community.leaders:
181
+ leader_member = self.community_manager.members.get(community.leaders[0])
182
+ leader_agent_id = leader_member.agent_id if leader_member else None
183
+ elif community.coordinators:
184
+ coordinator_member = self.community_manager.members.get(community.coordinators[0])
185
+ leader_agent_id = coordinator_member.agent_id if coordinator_member else None
186
+
187
+ # Ensure we have a leader agent ID
188
+ if not leader_agent_id:
189
+ raise ValueError("Cannot start collaborative session: no leader agent ID available")
190
+
191
+ # Start collaborative session
192
+ session_id = await self.workflow_engine.start_collaborative_session(
193
+ community_id=community_id,
194
+ session_leader_id=leader_agent_id,
195
+ session_type=collaboration_type,
196
+ purpose=purpose,
197
+ participants=participants,
198
+ session_config=session_config,
199
+ )
200
+
201
+ logger.info(f"Initiated {collaboration_type} collaboration in community {community_id}")
202
+ return session_id
203
+
204
+ async def propose_community_decision(
205
+ self,
206
+ community_id: str,
207
+ proposer_agent_id: str,
208
+ title: str,
209
+ description: str,
210
+ decision_type: str,
211
+ implementation_plan: Optional[str] = None,
212
+ ) -> str:
213
+ """
214
+ Propose a decision for community consideration.
215
+
216
+ Args:
217
+ community_id: ID of the community
218
+ proposer_agent_id: ID of the proposing agent
219
+ title: Title of the proposal
220
+ description: Detailed description
221
+ decision_type: Type of decision
222
+ implementation_plan: Optional implementation plan
223
+
224
+ Returns:
225
+ Decision ID
226
+ """
227
+ # Find the member ID for the proposing agent
228
+ proposer_member_id = None
229
+ for member_id, member in self.community_manager.members.items():
230
+ if member.agent_id == proposer_agent_id:
231
+ proposer_member_id = member_id
232
+ break
233
+
234
+ if not proposer_member_id:
235
+ raise TaskValidationError(f"Agent {proposer_agent_id} is not a community member")
236
+
237
+ decision_id = await self.community_manager.propose_decision(
238
+ community_id=community_id,
239
+ proposer_member_id=proposer_member_id,
240
+ title=title,
241
+ description=description,
242
+ decision_type=decision_type,
243
+ implementation_plan=implementation_plan,
244
+ )
245
+
246
+ logger.info(f"Agent {proposer_agent_id} proposed decision '{title}' in community {community_id}")
247
+ return decision_id
248
+
249
+ async def agent_vote_on_decision(self, decision_id: str, agent_id: str, vote: str) -> bool:
250
+ """
251
+ Cast a vote on behalf of an agent.
252
+
253
+ Args:
254
+ decision_id: ID of the decision
255
+ agent_id: ID of the voting agent
256
+ vote: Vote choice ("for", "against", "abstain")
257
+
258
+ Returns:
259
+ True if vote was cast successfully
260
+ """
261
+ # Find the member ID for the voting agent
262
+ member_id = None
263
+ for mid, member in self.community_manager.members.items():
264
+ if member.agent_id == agent_id:
265
+ member_id = mid
266
+ break
267
+
268
+ if not member_id:
269
+ raise TaskValidationError(f"Agent {agent_id} is not a community member")
270
+
271
+ success = await self.community_manager.vote_on_decision(decision_id=decision_id, member_id=member_id, vote=vote)
272
+
273
+ logger.info(f"Agent {agent_id} voted '{vote}' on decision {decision_id}")
274
+ return success
275
+
276
+ async def evaluate_community_decision(
277
+ self,
278
+ decision_id: str,
279
+ community_id: str,
280
+ algorithm: ConsensusAlgorithm = ConsensusAlgorithm.SIMPLE_MAJORITY,
281
+ ) -> Dict[str, Any]:
282
+ """
283
+ Evaluate a community decision using consensus algorithm.
284
+
285
+ Args:
286
+ decision_id: ID of the decision
287
+ community_id: ID of the community
288
+ algorithm: Consensus algorithm to use
289
+
290
+ Returns:
291
+ Evaluation result
292
+ """
293
+ passed, details = await self.decision_engine.evaluate_decision(
294
+ decision_id=decision_id,
295
+ community_id=community_id,
296
+ algorithm=algorithm,
297
+ )
298
+
299
+ result = {
300
+ "decision_id": decision_id,
301
+ "passed": passed,
302
+ "algorithm": algorithm,
303
+ "details": details,
304
+ "evaluated_at": datetime.utcnow().isoformat(),
305
+ }
306
+
307
+ logger.info(f"Decision {decision_id} evaluation: {'PASSED' if passed else 'REJECTED'}")
308
+ return result
309
+
310
+ async def create_community_knowledge_resource(
311
+ self,
312
+ community_id: str,
313
+ creator_agent_id: str,
314
+ title: str,
315
+ content: str,
316
+ knowledge_type: str = "general",
317
+ tags: Optional[List[str]] = None,
318
+ ) -> str:
319
+ """
320
+ Create a knowledge resource on behalf of an agent.
321
+
322
+ Args:
323
+ community_id: ID of the community
324
+ creator_agent_id: ID of the creating agent
325
+ title: Title of the knowledge resource
326
+ content: Knowledge content
327
+ knowledge_type: Type of knowledge
328
+ tags: Tags for categorization
329
+
330
+ Returns:
331
+ Resource ID
332
+ """
333
+ # Find the member ID for the creating agent
334
+ creator_member_id = None
335
+ for member_id, member in self.community_manager.members.items():
336
+ if member.agent_id == creator_agent_id:
337
+ creator_member_id = member_id
338
+ break
339
+
340
+ if not creator_member_id:
341
+ raise TaskValidationError(f"Agent {creator_agent_id} is not a community member")
342
+
343
+ resource_id = await self.resource_manager.create_knowledge_resource(
344
+ community_id=community_id,
345
+ owner_member_id=creator_member_id,
346
+ title=title,
347
+ content=content,
348
+ knowledge_type=knowledge_type,
349
+ tags=tags,
350
+ )
351
+
352
+ logger.info(f"Agent {creator_agent_id} created knowledge resource '{title}'")
353
+ return resource_id
354
+
355
+ async def get_agent_communities(self, agent_id: str) -> List[Dict[str, Any]]:
356
+ """
357
+ Get all communities that an agent belongs to.
358
+
359
+ Args:
360
+ agent_id: ID of the agent
361
+
362
+ Returns:
363
+ List of community information
364
+ """
365
+ communities = []
366
+
367
+ if agent_id in self.agent_community_mapping:
368
+ for community_id in self.agent_community_mapping[agent_id]:
369
+ community = self.community_manager.communities.get(community_id)
370
+ if community:
371
+ # Find agent's role in this community
372
+ agent_role = None
373
+ community_role = None
374
+ for member_id in community.members:
375
+ member = self.community_manager.members.get(member_id)
376
+ if member and member.agent_id == agent_id:
377
+ agent_role = member.agent_role
378
+ community_role = member.community_role
379
+ break
380
+
381
+ communities.append(
382
+ {
383
+ "community_id": community_id,
384
+ "name": community.name,
385
+ "description": community.description,
386
+ "governance_type": community.governance_type,
387
+ "agent_role": agent_role,
388
+ "community_role": community_role,
389
+ "member_count": len(community.members),
390
+ "is_leader": (member_id in community.leaders if member_id else False),
391
+ "is_coordinator": (member_id in community.coordinators if member_id else False),
392
+ }
393
+ )
394
+
395
+ return communities
396
+
397
+ async def get_community_status(self, community_id: str) -> Dict[str, Any]:
398
+ """
399
+ Get comprehensive status of a community.
400
+
401
+ Args:
402
+ community_id: ID of the community
403
+
404
+ Returns:
405
+ Community status information
406
+ """
407
+ community = self.community_manager.communities.get(community_id)
408
+ if not community:
409
+ raise TaskValidationError(f"Community not found: {community_id}")
410
+
411
+ # Get active sessions
412
+ active_sessions = [session_id for session_id, session in self.workflow_engine.active_sessions.items() if session.community_id == community_id]
413
+
414
+ # Get recent decisions
415
+ recent_decisions = [
416
+ decision
417
+ for decision in self.community_manager.decisions.values()
418
+ if any(
419
+ member.agent_id in self.community_agent_mapping.get(community_id, []) for member_id in [decision.proposer_id] for member in [self.community_manager.members.get(member_id)] if member
420
+ )
421
+ ]
422
+
423
+ status = {
424
+ "community_id": community_id,
425
+ "name": community.name,
426
+ "description": community.description,
427
+ "governance_type": community.governance_type,
428
+ "member_count": len(community.members),
429
+ "leader_count": len(community.leaders),
430
+ "coordinator_count": len(community.coordinators),
431
+ "resource_count": community.resource_count,
432
+ "decision_count": community.decision_count,
433
+ "activity_level": community.activity_level,
434
+ "collaboration_score": community.collaboration_score,
435
+ "active_sessions": len(active_sessions),
436
+ "recent_decisions": len(recent_decisions),
437
+ "is_active": community.is_active,
438
+ "created_at": community.created_at.isoformat(),
439
+ "updated_at": (community.updated_at.isoformat() if community.updated_at else None),
440
+ }
441
+
442
+ return status
443
+
444
+ # ========== Quick-Create Factory Methods ==========
445
+
446
+ async def create_temporary_community(
447
+ self,
448
+ name: str,
449
+ description: str,
450
+ agent_roles: List[str],
451
+ duration_minutes: int = 60,
452
+ auto_cleanup: bool = True,
453
+ governance_type: GovernanceType = GovernanceType.DEMOCRATIC,
454
+ creator_agent_id: Optional[str] = None,
455
+ ) -> str:
456
+ """
457
+ Create a temporary community with automatic cleanup.
458
+
459
+ Args:
460
+ name: Name of the community
461
+ description: Description
462
+ agent_roles: List of agent roles to include
463
+ duration_minutes: Duration before auto-cleanup
464
+ auto_cleanup: Whether to automatically cleanup after duration
465
+ governance_type: Type of governance
466
+ creator_agent_id: ID of the creating agent
467
+
468
+ Returns:
469
+ Community ID
470
+ """
471
+ community_id = await self.create_agent_community(
472
+ name=name,
473
+ description=description,
474
+ agent_roles=agent_roles,
475
+ governance_type=governance_type,
476
+ creator_agent_id=creator_agent_id,
477
+ )
478
+
479
+ # Mark as temporary
480
+ community = self.community_manager.communities[community_id]
481
+ community.metadata["temporary"] = True
482
+ community.metadata["created_for_duration"] = duration_minutes
483
+ community.metadata["cleanup_at"] = (datetime.utcnow() + timedelta(minutes=duration_minutes)).isoformat()
484
+
485
+ # Schedule cleanup if enabled
486
+ if auto_cleanup:
487
+ asyncio.create_task(self._cleanup_temporary_community(community_id, duration_minutes))
488
+
489
+ logger.info(f"Created temporary community {name} for {duration_minutes} minutes")
490
+ return community_id
491
+
492
+ async def _cleanup_temporary_community(self, community_id: str, duration_minutes: int) -> None:
493
+ """Cleanup temporary community after duration."""
494
+ await asyncio.sleep(duration_minutes * 60)
495
+
496
+ try:
497
+ community = self.community_manager.communities.get(community_id)
498
+ if community and community.metadata.get("temporary"):
499
+ # Mark as inactive
500
+ community.is_active = False
501
+ community.metadata["cleanup_completed"] = datetime.utcnow().isoformat()
502
+ logger.info(f"Cleaned up temporary community {community_id}")
503
+ except Exception as e:
504
+ logger.error(f"Error cleaning up temporary community {community_id}: {e}")
505
+
506
+ async def create_project_community(
507
+ self,
508
+ project_name: str,
509
+ project_description: str,
510
+ agent_roles: List[str],
511
+ project_goal: str,
512
+ project_deadline: Optional[datetime] = None,
513
+ creator_agent_id: Optional[str] = None,
514
+ ) -> str:
515
+ """
516
+ Create a community pre-configured for project collaboration.
517
+
518
+ Args:
519
+ project_name: Name of the project
520
+ project_description: Project description
521
+ agent_roles: List of agent roles for the project
522
+ project_goal: Goal of the project
523
+ project_deadline: Optional project deadline
524
+ creator_agent_id: ID of the creating agent
525
+
526
+ Returns:
527
+ Community ID
528
+ """
529
+ community_id = await self.create_agent_community(
530
+ name=f"Project: {project_name}",
531
+ description=project_description,
532
+ agent_roles=agent_roles,
533
+ governance_type=GovernanceType.HIERARCHICAL, # Project-based governance
534
+ creator_agent_id=creator_agent_id,
535
+ )
536
+
537
+ # Configure for project collaboration
538
+ community = self.community_manager.communities[community_id]
539
+ community.metadata["type"] = "project"
540
+ community.metadata["project_goal"] = project_goal
541
+ if project_deadline:
542
+ community.metadata["project_deadline"] = project_deadline.isoformat()
543
+
544
+ # Create initial project resources
545
+ if creator_agent_id:
546
+ # Find creator member
547
+ creator_member_id = None
548
+ for mid, member in self.community_manager.members.items():
549
+ if member.agent_id == creator_agent_id and mid in community.members:
550
+ creator_member_id = mid
551
+ break
552
+
553
+ if creator_member_id:
554
+ # Create project charter resource
555
+ await self.resource_manager.create_knowledge_resource(
556
+ community_id=community_id,
557
+ owner_member_id=creator_member_id,
558
+ title=f"{project_name} Charter",
559
+ content=f"Goal: {project_goal}\n\nDescription: {project_description}",
560
+ knowledge_type="project_charter",
561
+ tags=["project", "charter", project_name],
562
+ )
563
+
564
+ logger.info(f"Created project community: {project_name}")
565
+ return community_id
566
+
567
+ async def create_research_community(
568
+ self,
569
+ research_topic: str,
570
+ research_questions: List[str],
571
+ agent_roles: List[str],
572
+ methodologies: Optional[List[str]] = None,
573
+ creator_agent_id: Optional[str] = None,
574
+ ) -> str:
575
+ """
576
+ Create a community pre-configured for research collaboration.
577
+
578
+ Args:
579
+ research_topic: Topic of research
580
+ research_questions: Research questions to explore
581
+ agent_roles: List of agent roles for research
582
+ methodologies: Optional research methodologies
583
+ creator_agent_id: ID of the creating agent
584
+
585
+ Returns:
586
+ Community ID
587
+ """
588
+ community_id = await self.create_agent_community(
589
+ name=f"Research: {research_topic}",
590
+ description=f"Collaborative research on {research_topic}",
591
+ agent_roles=agent_roles,
592
+ governance_type=GovernanceType.CONSENSUS, # Consensus-based for research
593
+ creator_agent_id=creator_agent_id,
594
+ )
595
+
596
+ # Configure for research
597
+ community = self.community_manager.communities[community_id]
598
+ community.metadata["type"] = "research"
599
+ community.metadata["research_topic"] = research_topic
600
+ community.metadata["research_questions"] = research_questions
601
+ if methodologies:
602
+ community.metadata["methodologies"] = methodologies
603
+
604
+ # Create research resources
605
+ if creator_agent_id:
606
+ # Find creator member
607
+ creator_member_id = None
608
+ for mid, member in self.community_manager.members.items():
609
+ if member.agent_id == creator_agent_id and mid in community.members:
610
+ creator_member_id = mid
611
+ break
612
+
613
+ if creator_member_id:
614
+ # Create research plan resource
615
+ research_plan = {
616
+ "topic": research_topic,
617
+ "questions": research_questions,
618
+ "methodologies": methodologies or [],
619
+ "status": "planning",
620
+ }
621
+
622
+ await self.resource_manager.create_knowledge_resource(
623
+ community_id=community_id,
624
+ owner_member_id=creator_member_id,
625
+ title=f"{research_topic} Research Plan",
626
+ content=str(research_plan),
627
+ knowledge_type="research_plan",
628
+ tags=["research", "plan", research_topic],
629
+ )
630
+
631
+ logger.info(f"Created research community: {research_topic}")
632
+ return community_id
633
+
634
+ async def quick_brainstorm(
635
+ self,
636
+ topic: str,
637
+ agent_ids: List[str],
638
+ duration_minutes: int = 30,
639
+ auto_cleanup: bool = True,
640
+ ) -> Dict[str, Any]:
641
+ """
642
+ Quick one-line brainstorming session with temporary community.
643
+
644
+ Args:
645
+ topic: Topic to brainstorm
646
+ agent_ids: List of agent IDs to participate
647
+ duration_minutes: Duration of the session
648
+ auto_cleanup: Whether to cleanup community after
649
+
650
+ Returns:
651
+ Session results and summary
652
+ """
653
+ # Create temporary community
654
+ community_id = await self.create_temporary_community(
655
+ name=f"Brainstorm: {topic}",
656
+ description=f"Quick brainstorming session on {topic}",
657
+ agent_roles=[], # Will add specific agents
658
+ duration_minutes=duration_minutes,
659
+ auto_cleanup=auto_cleanup,
660
+ governance_type=GovernanceType.DEMOCRATIC,
661
+ )
662
+
663
+ # Add specific agents to community
664
+ for agent_id in agent_ids:
665
+ await self._add_agent_to_community(
666
+ community_id=community_id,
667
+ agent_id=agent_id,
668
+ agent_role="brainstormer",
669
+ community_role=CommunityRole.CONTRIBUTOR,
670
+ )
671
+
672
+ # Ensure we have at least one agent
673
+ if not agent_ids:
674
+ raise ValueError("Cannot start brainstorming session: no agents provided")
675
+
676
+ # Start brainstorming session
677
+ session_id = await self.workflow_engine.start_collaborative_session(
678
+ community_id=community_id,
679
+ session_leader_id=agent_ids[0],
680
+ session_type="brainstorming",
681
+ purpose=f"Brainstorm ideas for {topic}",
682
+ participants=[mid for mid in self.community_manager.communities[community_id].members],
683
+ duration_minutes=duration_minutes,
684
+ )
685
+
686
+ # Wait for session to complete (simplified - in reality would be async)
687
+ await asyncio.sleep(2) # Simulate session time
688
+
689
+ # End session and get results
690
+ summary = await self.workflow_engine.end_session(session_id)
691
+
692
+ results = {
693
+ "topic": topic,
694
+ "community_id": community_id,
695
+ "session_id": session_id,
696
+ "participants": agent_ids,
697
+ "duration_minutes": duration_minutes,
698
+ "summary": summary,
699
+ }
700
+
701
+ logger.info(f"Completed quick brainstorm on {topic}")
702
+ return results
703
+
704
+ # ========== Context Managers ==========
705
+
706
+ @asynccontextmanager
707
+ async def temporary_community(
708
+ self,
709
+ name: str,
710
+ agent_roles: List[str],
711
+ governance_type: GovernanceType = GovernanceType.DEMOCRATIC,
712
+ creator_agent_id: Optional[str] = None,
713
+ ):
714
+ """
715
+ Context manager for temporary communities with automatic cleanup.
716
+
717
+ Args:
718
+ name: Name of the community
719
+ agent_roles: List of agent roles
720
+ governance_type: Type of governance
721
+ creator_agent_id: ID of the creating agent
722
+
723
+ Yields:
724
+ Community ID
725
+
726
+ Example:
727
+ async with integration.temporary_community("Quick Collab", ["analyst", "writer"]) as community_id:
728
+ # Use community
729
+ await integration.initiate_community_collaboration(...)
730
+ # Community automatically cleaned up
731
+ """
732
+ community_id = await self.create_agent_community(
733
+ name=name,
734
+ description=f"Temporary community: {name}",
735
+ agent_roles=agent_roles,
736
+ governance_type=governance_type,
737
+ creator_agent_id=creator_agent_id,
738
+ )
739
+
740
+ try:
741
+ yield community_id
742
+ finally:
743
+ # Cleanup
744
+ community = self.community_manager.communities.get(community_id)
745
+ if community:
746
+ community.is_active = False
747
+ community.metadata["context_manager_cleanup"] = datetime.utcnow().isoformat()
748
+ logger.info(f"Context manager cleaned up community {community_id}")
749
+
750
+ @asynccontextmanager
751
+ async def collaborative_session(
752
+ self,
753
+ community_id: str,
754
+ session_type: str,
755
+ purpose: str,
756
+ leader_agent_id: Optional[str] = None,
757
+ participants: Optional[List[str]] = None,
758
+ ):
759
+ """
760
+ Context manager for collaborative sessions with automatic cleanup.
761
+
762
+ Args:
763
+ community_id: ID of the community
764
+ session_type: Type of session
765
+ purpose: Purpose of the session
766
+ leader_agent_id: Optional leader agent ID
767
+ participants: Optional specific participants
768
+
769
+ Yields:
770
+ Session ID
771
+
772
+ Example:
773
+ async with integration.collaborative_session(
774
+ community_id, "brainstorming", "Generate ideas"
775
+ ) as session_id:
776
+ # Session is active
777
+ pass
778
+ # Session automatically ended
779
+ """
780
+ session_id = await self.initiate_community_collaboration(
781
+ community_id=community_id,
782
+ collaboration_type=session_type,
783
+ purpose=purpose,
784
+ leader_agent_id=leader_agent_id,
785
+ specific_participants=participants,
786
+ )
787
+
788
+ try:
789
+ yield session_id
790
+ finally:
791
+ # End session
792
+ try:
793
+ await self.workflow_engine.end_session(session_id)
794
+ logger.info(f"Context manager ended session {session_id}")
795
+ except Exception as e:
796
+ logger.error(f"Error ending session in context manager: {e}")