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.
- aiecs/__init__.py +13 -16
- aiecs/__main__.py +7 -7
- aiecs/aiecs_client.py +269 -75
- aiecs/application/executors/operation_executor.py +79 -54
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/data_quality.py +302 -0
- aiecs/application/knowledge_graph/builder/data_reshaping.py +293 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +369 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +490 -0
- aiecs/application/knowledge_graph/builder/import_optimizer.py +396 -0
- aiecs/application/knowledge_graph/builder/schema_inference.py +462 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +563 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +1384 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +317 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +98 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +422 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +347 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +241 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +78 -0
- aiecs/application/knowledge_graph/fusion/ab_testing.py +395 -0
- aiecs/application/knowledge_graph/fusion/abbreviation_expander.py +327 -0
- aiecs/application/knowledge_graph/fusion/alias_index.py +597 -0
- aiecs/application/knowledge_graph/fusion/alias_matcher.py +384 -0
- aiecs/application/knowledge_graph/fusion/cache_coordinator.py +343 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +433 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +511 -0
- aiecs/application/knowledge_graph/fusion/evaluation_dataset.py +240 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +632 -0
- aiecs/application/knowledge_graph/fusion/matching_config.py +489 -0
- aiecs/application/knowledge_graph/fusion/name_normalizer.py +352 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +183 -0
- aiecs/application/knowledge_graph/fusion/semantic_name_matcher.py +464 -0
- aiecs/application/knowledge_graph/fusion/similarity_pipeline.py +534 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +342 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +366 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +195 -0
- aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
- aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
- aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +341 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +500 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +163 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +913 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +866 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +475 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +396 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +208 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +170 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +855 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +518 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +27 -0
- aiecs/application/knowledge_graph/retrieval/query_intent_classifier.py +211 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +592 -0
- aiecs/application/knowledge_graph/retrieval/strategy_types.py +23 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +457 -0
- aiecs/application/knowledge_graph/search/reranker.py +293 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +535 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +392 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +305 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +271 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +239 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +313 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +471 -0
- aiecs/config/__init__.py +20 -5
- aiecs/config/config.py +762 -31
- aiecs/config/graph_config.py +131 -0
- aiecs/config/tool_config.py +399 -0
- aiecs/core/__init__.py +29 -13
- aiecs/core/interface/__init__.py +2 -2
- aiecs/core/interface/execution_interface.py +22 -22
- aiecs/core/interface/storage_interface.py +37 -88
- aiecs/core/registry/__init__.py +31 -0
- aiecs/core/registry/service_registry.py +92 -0
- aiecs/domain/__init__.py +270 -1
- aiecs/domain/agent/__init__.py +191 -0
- aiecs/domain/agent/base_agent.py +3870 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1435 -0
- aiecs/domain/agent/integration/__init__.py +29 -0
- aiecs/domain/agent/integration/context_compressor.py +216 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +587 -0
- aiecs/domain/agent/integration/protocols.py +281 -0
- aiecs/domain/agent/integration/retry_policy.py +218 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +1892 -0
- aiecs/domain/agent/lifecycle.py +291 -0
- aiecs/domain/agent/llm_agent.py +692 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +1124 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +163 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +86 -0
- aiecs/domain/agent/models.py +884 -0
- aiecs/domain/agent/observability.py +479 -0
- aiecs/domain/agent/persistence.py +449 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +159 -0
- aiecs/domain/agent/prompts/formatters.py +187 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +253 -0
- aiecs/domain/agent/tool_agent.py +444 -0
- aiecs/domain/agent/tools/__init__.py +15 -0
- aiecs/domain/agent/tools/schema_generator.py +364 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +469 -0
- aiecs/domain/community/analytics.py +432 -0
- aiecs/domain/community/collaborative_workflow.py +648 -0
- aiecs/domain/community/communication_hub.py +634 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +796 -0
- aiecs/domain/community/community_manager.py +803 -0
- aiecs/domain/community/decision_engine.py +849 -0
- aiecs/domain/community/exceptions.py +231 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +234 -0
- aiecs/domain/community/resource_manager.py +461 -0
- aiecs/domain/community/shared_context_manager.py +589 -0
- aiecs/domain/context/__init__.py +40 -10
- aiecs/domain/context/context_engine.py +1910 -0
- aiecs/domain/context/conversation_models.py +87 -53
- aiecs/domain/context/graph_memory.py +582 -0
- aiecs/domain/execution/model.py +12 -4
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +148 -0
- aiecs/domain/knowledge_graph/models/evidence.py +178 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +184 -0
- aiecs/domain/knowledge_graph/models/path.py +171 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +171 -0
- aiecs/domain/knowledge_graph/models/query.py +261 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +181 -0
- aiecs/domain/knowledge_graph/models/relation.py +202 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +131 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +253 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +143 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +163 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +691 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +209 -0
- aiecs/domain/task/dsl_processor.py +172 -56
- aiecs/domain/task/model.py +20 -8
- aiecs/domain/task/task_context.py +27 -24
- aiecs/infrastructure/__init__.py +0 -2
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +837 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +458 -0
- aiecs/infrastructure/graph_storage/cache.py +424 -0
- aiecs/infrastructure/graph_storage/distributed.py +223 -0
- aiecs/infrastructure/graph_storage/error_handling.py +380 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +294 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +1197 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +446 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +431 -0
- aiecs/infrastructure/graph_storage/metrics.py +344 -0
- aiecs/infrastructure/graph_storage/migration.py +400 -0
- aiecs/infrastructure/graph_storage/pagination.py +483 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +456 -0
- aiecs/infrastructure/graph_storage/postgres.py +1563 -0
- aiecs/infrastructure/graph_storage/property_storage.py +353 -0
- aiecs/infrastructure/graph_storage/protocols.py +76 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +642 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +1373 -0
- aiecs/infrastructure/graph_storage/streaming.py +487 -0
- aiecs/infrastructure/graph_storage/tenant.py +412 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +92 -54
- aiecs/infrastructure/messaging/websocket_manager.py +51 -35
- aiecs/infrastructure/monitoring/__init__.py +22 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +45 -11
- aiecs/infrastructure/monitoring/global_metrics_manager.py +212 -0
- aiecs/infrastructure/monitoring/structured_logger.py +3 -7
- aiecs/infrastructure/monitoring/tracing_manager.py +63 -35
- aiecs/infrastructure/persistence/__init__.py +14 -1
- aiecs/infrastructure/persistence/context_engine_client.py +184 -0
- aiecs/infrastructure/persistence/database_manager.py +67 -43
- aiecs/infrastructure/persistence/file_storage.py +180 -103
- aiecs/infrastructure/persistence/redis_client.py +74 -21
- aiecs/llm/__init__.py +73 -25
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/{custom_callbacks.py → callbacks/custom_callbacks.py} +26 -19
- aiecs/llm/client_factory.py +224 -36
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +324 -0
- aiecs/llm/clients/google_function_calling_mixin.py +457 -0
- aiecs/llm/clients/googleai_client.py +241 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +897 -0
- aiecs/llm/clients/xai_client.py +201 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +272 -0
- aiecs/llm/config/config_validator.py +206 -0
- aiecs/llm/config/model_config.py +143 -0
- aiecs/llm/protocols.py +149 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +89 -0
- aiecs/main.py +140 -121
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +138 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/module_checker.py +499 -0
- aiecs/scripts/aid/version_manager.py +235 -0
- aiecs/scripts/{DEPENDENCY_SYSTEM_SUMMARY.md → dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md} +1 -0
- aiecs/scripts/{README_DEPENDENCY_CHECKER.md → dependance_check/README_DEPENDENCY_CHECKER.md} +1 -0
- aiecs/scripts/dependance_check/__init__.py +15 -0
- aiecs/scripts/dependance_check/dependency_checker.py +1835 -0
- aiecs/scripts/{dependency_fixer.py → dependance_check/dependency_fixer.py} +192 -90
- aiecs/scripts/{download_nlp_data.py → dependance_check/download_nlp_data.py} +203 -71
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/{fix_weasel_validator.py → dependance_patch/fix_weasel/fix_weasel_validator.py} +21 -14
- aiecs/scripts/{patch_weasel_library.sh → dependance_patch/fix_weasel/patch_weasel_library.sh} +1 -1
- aiecs/scripts/knowledge_graph/__init__.py +3 -0
- aiecs/scripts/knowledge_graph/run_threshold_experiments.py +212 -0
- aiecs/scripts/migrations/multi_tenancy/README.md +142 -0
- aiecs/scripts/tools_develop/README.md +671 -0
- aiecs/scripts/tools_develop/README_CONFIG_CHECKER.md +273 -0
- aiecs/scripts/tools_develop/TOOLS_CONFIG_GUIDE.md +1287 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_all_tools_config.py +548 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +257 -0
- aiecs/scripts/tools_develop/pre-commit-schema-coverage.sh +66 -0
- aiecs/scripts/tools_develop/schema_coverage.py +511 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +475 -0
- aiecs/scripts/tools_develop/verify_executor_config_fix.py +98 -0
- aiecs/scripts/tools_develop/verify_tools.py +352 -0
- aiecs/tasks/__init__.py +0 -1
- aiecs/tasks/worker.py +115 -47
- aiecs/tools/__init__.py +194 -72
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +632 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +417 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +385 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +330 -0
- aiecs/tools/apisource/providers/__init__.py +112 -0
- aiecs/tools/apisource/providers/base.py +671 -0
- aiecs/tools/apisource/providers/census.py +397 -0
- aiecs/tools/apisource/providers/fred.py +535 -0
- aiecs/tools/apisource/providers/newsapi.py +409 -0
- aiecs/tools/apisource/providers/worldbank.py +352 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +363 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +376 -0
- aiecs/tools/apisource/tool.py +832 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +334 -0
- aiecs/tools/base_tool.py +415 -21
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +607 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2350 -0
- aiecs/tools/docs/content_insertion_tool.py +1320 -0
- aiecs/tools/docs/document_creator_tool.py +1323 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1011 -0
- aiecs/tools/docs/document_writer_tool.py +1829 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +807 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +944 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +524 -0
- aiecs/tools/langchain_adapter.py +300 -138
- aiecs/tools/schema_generator.py +455 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +581 -0
- aiecs/tools/search_tool/cache.py +264 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +224 -0
- aiecs/tools/search_tool/core.py +778 -0
- aiecs/tools/search_tool/deduplicator.py +119 -0
- aiecs/tools/search_tool/error_handler.py +242 -0
- aiecs/tools/search_tool/metrics.py +343 -0
- aiecs/tools/search_tool/rate_limiter.py +172 -0
- aiecs/tools/search_tool/schemas.py +275 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +646 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +508 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +684 -0
- aiecs/tools/statistics/data_loader_tool.py +555 -0
- aiecs/tools/statistics/data_profiler_tool.py +638 -0
- aiecs/tools/statistics/data_transformer_tool.py +580 -0
- aiecs/tools/statistics/data_visualizer_tool.py +498 -0
- aiecs/tools/statistics/model_trainer_tool.py +507 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +472 -0
- aiecs/tools/task_tools/__init__.py +49 -36
- aiecs/tools/task_tools/chart_tool.py +200 -184
- aiecs/tools/task_tools/classfire_tool.py +268 -267
- aiecs/tools/task_tools/image_tool.py +175 -131
- aiecs/tools/task_tools/office_tool.py +226 -146
- aiecs/tools/task_tools/pandas_tool.py +477 -121
- aiecs/tools/task_tools/report_tool.py +390 -142
- aiecs/tools/task_tools/research_tool.py +149 -79
- aiecs/tools/task_tools/scraper_tool.py +339 -145
- aiecs/tools/task_tools/stats_tool.py +448 -209
- aiecs/tools/temp_file_manager.py +26 -24
- aiecs/tools/tool_executor/__init__.py +18 -16
- aiecs/tools/tool_executor/tool_executor.py +364 -52
- aiecs/utils/LLM_output_structor.py +74 -48
- aiecs/utils/__init__.py +14 -3
- aiecs/utils/base_callback.py +0 -3
- aiecs/utils/cache_provider.py +696 -0
- aiecs/utils/execution_utils.py +50 -31
- aiecs/utils/prompt_loader.py +1 -0
- aiecs/utils/token_usage_repository.py +37 -11
- aiecs/ws/socket_server.py +14 -4
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/METADATA +52 -15
- aiecs-1.7.6.dist-info/RECORD +337 -0
- aiecs-1.7.6.dist-info/entry_points.txt +13 -0
- aiecs/config/registry.py +0 -19
- aiecs/domain/context/content_engine.py +0 -982
- aiecs/llm/base_client.py +0 -99
- aiecs/llm/openai_client.py +0 -125
- aiecs/llm/vertex_client.py +0 -186
- aiecs/llm/xai_client.py +0 -184
- aiecs/scripts/dependency_checker.py +0 -857
- aiecs/scripts/quick_dependency_check.py +0 -269
- aiecs/tools/task_tools/search_api.py +0 -7
- aiecs-1.0.1.dist-info/RECORD +0 -90
- aiecs-1.0.1.dist-info/entry_points.txt +0 -7
- /aiecs/scripts/{setup_nlp_data.sh → dependance_check/setup_nlp_data.sh} +0 -0
- /aiecs/scripts/{README_WEASEL_PATCH.md → dependance_patch/fix_weasel/README_WEASEL_PATCH.md} +0 -0
- /aiecs/scripts/{fix_weasel_validator.sh → dependance_patch/fix_weasel/fix_weasel_validator.sh} +0 -0
- /aiecs/scripts/{run_weasel_patch.sh → dependance_patch/fix_weasel/run_weasel_patch.sh} +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/licenses/LICENSE +0 -0
- {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}")
|