aiecs 1.0.1__py3-none-any.whl → 1.7.17__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of aiecs might be problematic. Click here for more details.
- 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 +435 -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 +3949 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1731 -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 +894 -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 +377 -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 +230 -37
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +328 -0
- aiecs/llm/clients/google_function_calling_mixin.py +415 -0
- aiecs/llm/clients/googleai_client.py +314 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +1186 -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 +1464 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1016 -0
- aiecs/tools/docs/document_writer_tool.py +2008 -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 +220 -141
- 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.17.dist-info}/METADATA +52 -15
- aiecs-1.7.17.dist-info/RECORD +337 -0
- aiecs-1.7.17.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.17.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/licenses/LICENSE +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.17.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,648 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Collaborative Workflow Engine
|
|
3
|
+
|
|
4
|
+
Orchestrates collaborative workflows within agent communities,
|
|
5
|
+
including brainstorming, problem-solving, and knowledge synthesis.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
import logging
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
from typing import Dict, List, Any, Optional, TYPE_CHECKING
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from .community_manager import CommunityManager
|
|
14
|
+
from .resource_manager import ResourceManager
|
|
15
|
+
from .decision_engine import DecisionEngine
|
|
16
|
+
import asyncio
|
|
17
|
+
|
|
18
|
+
from .models.community_models import CollaborationSession
|
|
19
|
+
from .exceptions import CommunityValidationError as TaskValidationError
|
|
20
|
+
|
|
21
|
+
logger = logging.getLogger(__name__)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class CollaborativeWorkflowEngine:
|
|
25
|
+
"""
|
|
26
|
+
Engine for orchestrating collaborative workflows within agent communities.
|
|
27
|
+
"""
|
|
28
|
+
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
community_manager: Optional["CommunityManager"] = None,
|
|
32
|
+
resource_manager: Optional["ResourceManager"] = None,
|
|
33
|
+
decision_engine: Optional["DecisionEngine"] = None,
|
|
34
|
+
) -> None:
|
|
35
|
+
"""
|
|
36
|
+
Initialize the collaborative workflow engine.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
community_manager: Reference to the community manager
|
|
40
|
+
resource_manager: Reference to the resource manager
|
|
41
|
+
decision_engine: Reference to the decision engine
|
|
42
|
+
"""
|
|
43
|
+
self.community_manager = community_manager
|
|
44
|
+
self.resource_manager = resource_manager
|
|
45
|
+
self.decision_engine = decision_engine
|
|
46
|
+
|
|
47
|
+
# Active collaborative sessions
|
|
48
|
+
self.active_sessions: Dict[str, CollaborationSession] = {}
|
|
49
|
+
|
|
50
|
+
# Workflow templates
|
|
51
|
+
self.workflow_templates = {
|
|
52
|
+
"brainstorming": self._brainstorming_workflow,
|
|
53
|
+
"problem_solving": self._problem_solving_workflow,
|
|
54
|
+
"knowledge_synthesis": self._knowledge_synthesis_workflow,
|
|
55
|
+
"decision_making": self._decision_making_workflow,
|
|
56
|
+
"resource_creation": self._resource_creation_workflow,
|
|
57
|
+
"peer_review": self._peer_review_workflow,
|
|
58
|
+
"consensus_building": self._consensus_building_workflow,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
logger.info("Collaborative workflow engine initialized")
|
|
62
|
+
|
|
63
|
+
async def start_collaborative_session(
|
|
64
|
+
self,
|
|
65
|
+
community_id: str,
|
|
66
|
+
session_leader_id: str,
|
|
67
|
+
session_type: str,
|
|
68
|
+
purpose: str,
|
|
69
|
+
participants: List[str],
|
|
70
|
+
agenda: Optional[List[str]] = None,
|
|
71
|
+
duration_minutes: int = 60,
|
|
72
|
+
session_config: Optional[Dict[str, Any]] = None,
|
|
73
|
+
) -> str:
|
|
74
|
+
"""
|
|
75
|
+
Start a collaborative session.
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
community_id: ID of the community
|
|
79
|
+
session_leader_id: ID of the session leader
|
|
80
|
+
session_type: Type of collaborative session
|
|
81
|
+
purpose: Purpose of the session
|
|
82
|
+
participants: List of participant member IDs
|
|
83
|
+
agenda: Optional agenda items
|
|
84
|
+
duration_minutes: Expected duration in minutes
|
|
85
|
+
session_config: Optional session configuration
|
|
86
|
+
|
|
87
|
+
Returns:
|
|
88
|
+
Session ID
|
|
89
|
+
"""
|
|
90
|
+
if not self.community_manager:
|
|
91
|
+
raise TaskValidationError("Community manager not available")
|
|
92
|
+
|
|
93
|
+
# Validate community and participants
|
|
94
|
+
community = self.community_manager.communities.get(community_id)
|
|
95
|
+
if not community:
|
|
96
|
+
raise TaskValidationError(f"Community not found: {community_id}")
|
|
97
|
+
|
|
98
|
+
# Create collaboration session
|
|
99
|
+
session = CollaborationSession(
|
|
100
|
+
community_id=community_id,
|
|
101
|
+
participants=participants,
|
|
102
|
+
session_leader=session_leader_id,
|
|
103
|
+
purpose=purpose,
|
|
104
|
+
session_type=session_type,
|
|
105
|
+
ended_at=None,
|
|
106
|
+
agenda=agenda or [],
|
|
107
|
+
metadata=session_config or {},
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
self.active_sessions[session.session_id] = session
|
|
111
|
+
|
|
112
|
+
# Execute workflow template if available
|
|
113
|
+
if session_type in self.workflow_templates:
|
|
114
|
+
workflow_func = self.workflow_templates[session_type]
|
|
115
|
+
await workflow_func(session)
|
|
116
|
+
|
|
117
|
+
logger.info(f"Started collaborative session: {session_type} ({session.session_id})")
|
|
118
|
+
return session.session_id
|
|
119
|
+
|
|
120
|
+
async def _brainstorming_workflow(self, session: CollaborationSession) -> None:
|
|
121
|
+
"""
|
|
122
|
+
Execute brainstorming workflow.
|
|
123
|
+
|
|
124
|
+
Phases:
|
|
125
|
+
1. Idea generation
|
|
126
|
+
2. Idea collection and categorization
|
|
127
|
+
3. Idea evaluation and ranking
|
|
128
|
+
4. Action item creation
|
|
129
|
+
"""
|
|
130
|
+
logger.info(f"Starting brainstorming workflow for session {session.session_id}")
|
|
131
|
+
|
|
132
|
+
# Phase 1: Idea Generation
|
|
133
|
+
await self._execute_phase(
|
|
134
|
+
session,
|
|
135
|
+
"idea_generation",
|
|
136
|
+
{
|
|
137
|
+
"instructions": "Generate creative ideas related to the session purpose",
|
|
138
|
+
"time_limit_minutes": 15,
|
|
139
|
+
"parallel_thinking": True,
|
|
140
|
+
},
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
# Phase 2: Idea Collection
|
|
144
|
+
await self._execute_phase(
|
|
145
|
+
session,
|
|
146
|
+
"idea_collection",
|
|
147
|
+
{
|
|
148
|
+
"instructions": "Collect and categorize all generated ideas",
|
|
149
|
+
"time_limit_minutes": 10,
|
|
150
|
+
"collaborative": True,
|
|
151
|
+
},
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# Phase 3: Idea Evaluation
|
|
155
|
+
await self._execute_phase(
|
|
156
|
+
session,
|
|
157
|
+
"idea_evaluation",
|
|
158
|
+
{
|
|
159
|
+
"instructions": "Evaluate and rank ideas based on feasibility and impact",
|
|
160
|
+
"time_limit_minutes": 15,
|
|
161
|
+
"voting_enabled": True,
|
|
162
|
+
},
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
# Phase 4: Action Planning
|
|
166
|
+
await self._execute_phase(
|
|
167
|
+
session,
|
|
168
|
+
"action_planning",
|
|
169
|
+
{
|
|
170
|
+
"instructions": "Create action items for top-ranked ideas",
|
|
171
|
+
"time_limit_minutes": 10,
|
|
172
|
+
"assign_responsibilities": True,
|
|
173
|
+
},
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
async def _problem_solving_workflow(self, session: CollaborationSession) -> None:
|
|
177
|
+
"""
|
|
178
|
+
Execute problem-solving workflow.
|
|
179
|
+
|
|
180
|
+
Phases:
|
|
181
|
+
1. Problem definition and analysis
|
|
182
|
+
2. Root cause analysis
|
|
183
|
+
3. Solution brainstorming
|
|
184
|
+
4. Solution evaluation and selection
|
|
185
|
+
5. Implementation planning
|
|
186
|
+
"""
|
|
187
|
+
logger.info(f"Starting problem-solving workflow for session {session.session_id}")
|
|
188
|
+
|
|
189
|
+
# Phase 1: Problem Definition
|
|
190
|
+
await self._execute_phase(
|
|
191
|
+
session,
|
|
192
|
+
"problem_definition",
|
|
193
|
+
{
|
|
194
|
+
"instructions": "Define the problem clearly and analyze its scope",
|
|
195
|
+
"time_limit_minutes": 15,
|
|
196
|
+
"structured_analysis": True,
|
|
197
|
+
},
|
|
198
|
+
)
|
|
199
|
+
|
|
200
|
+
# Phase 2: Root Cause Analysis
|
|
201
|
+
await self._execute_phase(
|
|
202
|
+
session,
|
|
203
|
+
"root_cause_analysis",
|
|
204
|
+
{
|
|
205
|
+
"instructions": "Identify root causes using systematic analysis",
|
|
206
|
+
"time_limit_minutes": 20,
|
|
207
|
+
"analysis_methods": ["5_whys", "fishbone", "pareto"],
|
|
208
|
+
},
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
# Phase 3: Solution Brainstorming
|
|
212
|
+
await self._execute_phase(
|
|
213
|
+
session,
|
|
214
|
+
"solution_brainstorming",
|
|
215
|
+
{
|
|
216
|
+
"instructions": "Generate potential solutions for identified root causes",
|
|
217
|
+
"time_limit_minutes": 20,
|
|
218
|
+
"creative_thinking": True,
|
|
219
|
+
},
|
|
220
|
+
)
|
|
221
|
+
|
|
222
|
+
# Phase 4: Solution Evaluation
|
|
223
|
+
await self._execute_phase(
|
|
224
|
+
session,
|
|
225
|
+
"solution_evaluation",
|
|
226
|
+
{
|
|
227
|
+
"instructions": "Evaluate solutions based on criteria matrix",
|
|
228
|
+
"time_limit_minutes": 15,
|
|
229
|
+
"evaluation_criteria": [
|
|
230
|
+
"feasibility",
|
|
231
|
+
"impact",
|
|
232
|
+
"cost",
|
|
233
|
+
"timeline",
|
|
234
|
+
],
|
|
235
|
+
},
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# Phase 5: Implementation Planning
|
|
239
|
+
await self._execute_phase(
|
|
240
|
+
session,
|
|
241
|
+
"implementation_planning",
|
|
242
|
+
{
|
|
243
|
+
"instructions": "Create detailed implementation plan for selected solution",
|
|
244
|
+
"time_limit_minutes": 15,
|
|
245
|
+
"create_timeline": True,
|
|
246
|
+
},
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
async def _knowledge_synthesis_workflow(self, session: CollaborationSession) -> None:
|
|
250
|
+
"""
|
|
251
|
+
Execute knowledge synthesis workflow.
|
|
252
|
+
|
|
253
|
+
Phases:
|
|
254
|
+
1. Knowledge gathering
|
|
255
|
+
2. Information analysis
|
|
256
|
+
3. Pattern identification
|
|
257
|
+
4. Synthesis and integration
|
|
258
|
+
5. Knowledge artifact creation
|
|
259
|
+
"""
|
|
260
|
+
logger.info(f"Starting knowledge synthesis workflow for session {session.session_id}")
|
|
261
|
+
|
|
262
|
+
# Phase 1: Knowledge Gathering
|
|
263
|
+
await self._execute_phase(
|
|
264
|
+
session,
|
|
265
|
+
"knowledge_gathering",
|
|
266
|
+
{
|
|
267
|
+
"instructions": "Gather relevant knowledge from community resources and expertise",
|
|
268
|
+
"time_limit_minutes": 20,
|
|
269
|
+
"resource_search": True,
|
|
270
|
+
},
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
# Phase 2: Information Analysis
|
|
274
|
+
await self._execute_phase(
|
|
275
|
+
session,
|
|
276
|
+
"information_analysis",
|
|
277
|
+
{
|
|
278
|
+
"instructions": "Analyze gathered information for relevance and quality",
|
|
279
|
+
"time_limit_minutes": 15,
|
|
280
|
+
"quality_assessment": True,
|
|
281
|
+
},
|
|
282
|
+
)
|
|
283
|
+
|
|
284
|
+
# Phase 3: Pattern Identification
|
|
285
|
+
await self._execute_phase(
|
|
286
|
+
session,
|
|
287
|
+
"pattern_identification",
|
|
288
|
+
{
|
|
289
|
+
"instructions": "Identify patterns, themes, and connections in the information",
|
|
290
|
+
"time_limit_minutes": 20,
|
|
291
|
+
"pattern_analysis": True,
|
|
292
|
+
},
|
|
293
|
+
)
|
|
294
|
+
|
|
295
|
+
# Phase 4: Synthesis
|
|
296
|
+
await self._execute_phase(
|
|
297
|
+
session,
|
|
298
|
+
"synthesis",
|
|
299
|
+
{
|
|
300
|
+
"instructions": "Synthesize information into coherent knowledge structure",
|
|
301
|
+
"time_limit_minutes": 25,
|
|
302
|
+
"collaborative_editing": True,
|
|
303
|
+
},
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
# Phase 5: Artifact Creation
|
|
307
|
+
await self._execute_phase(
|
|
308
|
+
session,
|
|
309
|
+
"artifact_creation",
|
|
310
|
+
{
|
|
311
|
+
"instructions": "Create knowledge artifacts for community sharing",
|
|
312
|
+
"time_limit_minutes": 15,
|
|
313
|
+
"create_resources": True,
|
|
314
|
+
},
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
async def _decision_making_workflow(self, session: CollaborationSession) -> None:
|
|
318
|
+
"""
|
|
319
|
+
Execute decision-making workflow.
|
|
320
|
+
|
|
321
|
+
Phases:
|
|
322
|
+
1. Decision framing
|
|
323
|
+
2. Option generation
|
|
324
|
+
3. Criteria definition
|
|
325
|
+
4. Option evaluation
|
|
326
|
+
5. Decision and commitment
|
|
327
|
+
"""
|
|
328
|
+
logger.info(f"Starting decision-making workflow for session {session.session_id}")
|
|
329
|
+
|
|
330
|
+
# Phase 1: Decision Framing
|
|
331
|
+
await self._execute_phase(
|
|
332
|
+
session,
|
|
333
|
+
"decision_framing",
|
|
334
|
+
{
|
|
335
|
+
"instructions": "Frame the decision clearly with context and constraints",
|
|
336
|
+
"time_limit_minutes": 15,
|
|
337
|
+
"structured_framing": True,
|
|
338
|
+
},
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
# Phase 2: Option Generation
|
|
342
|
+
await self._execute_phase(
|
|
343
|
+
session,
|
|
344
|
+
"option_generation",
|
|
345
|
+
{
|
|
346
|
+
"instructions": "Generate multiple decision options",
|
|
347
|
+
"time_limit_minutes": 20,
|
|
348
|
+
"creative_options": True,
|
|
349
|
+
},
|
|
350
|
+
)
|
|
351
|
+
|
|
352
|
+
# Phase 3: Criteria Definition
|
|
353
|
+
await self._execute_phase(
|
|
354
|
+
session,
|
|
355
|
+
"criteria_definition",
|
|
356
|
+
{
|
|
357
|
+
"instructions": "Define evaluation criteria and their weights",
|
|
358
|
+
"time_limit_minutes": 10,
|
|
359
|
+
"criteria_weighting": True,
|
|
360
|
+
},
|
|
361
|
+
)
|
|
362
|
+
|
|
363
|
+
# Phase 4: Option Evaluation
|
|
364
|
+
await self._execute_phase(
|
|
365
|
+
session,
|
|
366
|
+
"option_evaluation",
|
|
367
|
+
{
|
|
368
|
+
"instructions": "Evaluate options against defined criteria",
|
|
369
|
+
"time_limit_minutes": 20,
|
|
370
|
+
"systematic_evaluation": True,
|
|
371
|
+
},
|
|
372
|
+
)
|
|
373
|
+
|
|
374
|
+
# Phase 5: Decision Making
|
|
375
|
+
await self._execute_phase(
|
|
376
|
+
session,
|
|
377
|
+
"decision_making",
|
|
378
|
+
{
|
|
379
|
+
"instructions": "Make final decision and create commitment plan",
|
|
380
|
+
"time_limit_minutes": 15,
|
|
381
|
+
"consensus_building": True,
|
|
382
|
+
"create_decision": True,
|
|
383
|
+
},
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
async def _resource_creation_workflow(self, session: CollaborationSession) -> None:
|
|
387
|
+
"""Execute resource creation workflow."""
|
|
388
|
+
logger.info(f"Starting resource creation workflow for session {session.session_id}")
|
|
389
|
+
|
|
390
|
+
# Phase 1: Resource Planning
|
|
391
|
+
await self._execute_phase(
|
|
392
|
+
session,
|
|
393
|
+
"resource_planning",
|
|
394
|
+
{
|
|
395
|
+
"instructions": "Plan the resource to be created",
|
|
396
|
+
"time_limit_minutes": 15,
|
|
397
|
+
},
|
|
398
|
+
)
|
|
399
|
+
|
|
400
|
+
# Phase 2: Collaborative Creation
|
|
401
|
+
await self._execute_phase(
|
|
402
|
+
session,
|
|
403
|
+
"collaborative_creation",
|
|
404
|
+
{
|
|
405
|
+
"instructions": "Collaboratively create the resource",
|
|
406
|
+
"time_limit_minutes": 30,
|
|
407
|
+
"collaborative_editing": True,
|
|
408
|
+
},
|
|
409
|
+
)
|
|
410
|
+
|
|
411
|
+
# Phase 3: Review and Refinement
|
|
412
|
+
await self._execute_phase(
|
|
413
|
+
session,
|
|
414
|
+
"review_refinement",
|
|
415
|
+
{
|
|
416
|
+
"instructions": "Review and refine the created resource",
|
|
417
|
+
"time_limit_minutes": 15,
|
|
418
|
+
"peer_review": True,
|
|
419
|
+
},
|
|
420
|
+
)
|
|
421
|
+
|
|
422
|
+
async def _peer_review_workflow(self, session: CollaborationSession) -> None:
|
|
423
|
+
"""
|
|
424
|
+
Execute peer review workflow.
|
|
425
|
+
|
|
426
|
+
Phases:
|
|
427
|
+
1. Reviewer assignment
|
|
428
|
+
2. Individual review
|
|
429
|
+
3. Review collection and synthesis
|
|
430
|
+
4. Feedback integration
|
|
431
|
+
5. Final approval
|
|
432
|
+
"""
|
|
433
|
+
logger.info(f"Starting peer review workflow for session {session.session_id}")
|
|
434
|
+
|
|
435
|
+
# Phase 1: Reviewer Assignment
|
|
436
|
+
await self._execute_phase(
|
|
437
|
+
session,
|
|
438
|
+
"reviewer_assignment",
|
|
439
|
+
{
|
|
440
|
+
"instructions": "Assign reviewers based on expertise and availability",
|
|
441
|
+
"time_limit_minutes": 5,
|
|
442
|
+
"min_reviewers": 2,
|
|
443
|
+
"max_reviewers": 5,
|
|
444
|
+
},
|
|
445
|
+
)
|
|
446
|
+
|
|
447
|
+
# Phase 2: Individual Review
|
|
448
|
+
await self._execute_phase(
|
|
449
|
+
session,
|
|
450
|
+
"individual_review",
|
|
451
|
+
{
|
|
452
|
+
"instructions": "Conduct independent review of the material",
|
|
453
|
+
"time_limit_minutes": 30,
|
|
454
|
+
"review_criteria": [
|
|
455
|
+
"accuracy",
|
|
456
|
+
"completeness",
|
|
457
|
+
"clarity",
|
|
458
|
+
"quality",
|
|
459
|
+
],
|
|
460
|
+
"parallel_reviews": True,
|
|
461
|
+
},
|
|
462
|
+
)
|
|
463
|
+
|
|
464
|
+
# Phase 3: Review Collection
|
|
465
|
+
await self._execute_phase(
|
|
466
|
+
session,
|
|
467
|
+
"review_collection",
|
|
468
|
+
{
|
|
469
|
+
"instructions": "Collect and synthesize all review feedback",
|
|
470
|
+
"time_limit_minutes": 15,
|
|
471
|
+
"identify_conflicts": True,
|
|
472
|
+
"aggregate_scores": True,
|
|
473
|
+
},
|
|
474
|
+
)
|
|
475
|
+
|
|
476
|
+
# Phase 4: Feedback Integration
|
|
477
|
+
await self._execute_phase(
|
|
478
|
+
session,
|
|
479
|
+
"feedback_integration",
|
|
480
|
+
{
|
|
481
|
+
"instructions": "Integrate reviewer feedback into the material",
|
|
482
|
+
"time_limit_minutes": 20,
|
|
483
|
+
"collaborative_editing": True,
|
|
484
|
+
"track_changes": True,
|
|
485
|
+
},
|
|
486
|
+
)
|
|
487
|
+
|
|
488
|
+
# Phase 5: Final Approval
|
|
489
|
+
await self._execute_phase(
|
|
490
|
+
session,
|
|
491
|
+
"final_approval",
|
|
492
|
+
{
|
|
493
|
+
"instructions": "Reviewers provide final approval or request changes",
|
|
494
|
+
"time_limit_minutes": 10,
|
|
495
|
+
"require_consensus": True,
|
|
496
|
+
"approval_threshold": 0.8,
|
|
497
|
+
},
|
|
498
|
+
)
|
|
499
|
+
|
|
500
|
+
async def _consensus_building_workflow(self, session: CollaborationSession) -> None:
|
|
501
|
+
"""
|
|
502
|
+
Execute consensus building workflow.
|
|
503
|
+
|
|
504
|
+
Phases:
|
|
505
|
+
1. Issue presentation and clarification
|
|
506
|
+
2. Discussion round 1 - Position sharing
|
|
507
|
+
3. Common ground identification
|
|
508
|
+
4. Proposal refinement
|
|
509
|
+
5. Convergence check and agreement
|
|
510
|
+
"""
|
|
511
|
+
logger.info(f"Starting consensus building workflow for session {session.session_id}")
|
|
512
|
+
|
|
513
|
+
# Phase 1: Issue Presentation
|
|
514
|
+
await self._execute_phase(
|
|
515
|
+
session,
|
|
516
|
+
"issue_presentation",
|
|
517
|
+
{
|
|
518
|
+
"instructions": "Present the issue clearly and allow clarification questions",
|
|
519
|
+
"time_limit_minutes": 15,
|
|
520
|
+
"clarification_enabled": True,
|
|
521
|
+
},
|
|
522
|
+
)
|
|
523
|
+
|
|
524
|
+
# Phase 2: Position Sharing
|
|
525
|
+
await self._execute_phase(
|
|
526
|
+
session,
|
|
527
|
+
"position_sharing",
|
|
528
|
+
{
|
|
529
|
+
"instructions": "Each member shares their position and rationale",
|
|
530
|
+
"time_limit_minutes": 20,
|
|
531
|
+
"equal_participation": True,
|
|
532
|
+
"capture_positions": True,
|
|
533
|
+
},
|
|
534
|
+
)
|
|
535
|
+
|
|
536
|
+
# Phase 3: Common Ground Identification
|
|
537
|
+
await self._execute_phase(
|
|
538
|
+
session,
|
|
539
|
+
"common_ground_identification",
|
|
540
|
+
{
|
|
541
|
+
"instructions": "Identify areas of agreement and shared values",
|
|
542
|
+
"time_limit_minutes": 15,
|
|
543
|
+
"find_overlaps": True,
|
|
544
|
+
"identify_blockers": True,
|
|
545
|
+
},
|
|
546
|
+
)
|
|
547
|
+
|
|
548
|
+
# Phase 4: Proposal Refinement
|
|
549
|
+
await self._execute_phase(
|
|
550
|
+
session,
|
|
551
|
+
"proposal_refinement",
|
|
552
|
+
{
|
|
553
|
+
"instructions": "Refine proposals to address concerns and maximize agreement",
|
|
554
|
+
"time_limit_minutes": 25,
|
|
555
|
+
"iterative_refinement": True,
|
|
556
|
+
"test_proposals": True,
|
|
557
|
+
},
|
|
558
|
+
)
|
|
559
|
+
|
|
560
|
+
# Phase 5: Convergence Check
|
|
561
|
+
await self._execute_phase(
|
|
562
|
+
session,
|
|
563
|
+
"convergence_check",
|
|
564
|
+
{
|
|
565
|
+
"instructions": "Check for consensus and finalize agreement",
|
|
566
|
+
"time_limit_minutes": 15,
|
|
567
|
+
"consensus_threshold": 0.9,
|
|
568
|
+
"allow_dissent": True,
|
|
569
|
+
"document_agreement": True,
|
|
570
|
+
},
|
|
571
|
+
)
|
|
572
|
+
|
|
573
|
+
async def _execute_phase(
|
|
574
|
+
self,
|
|
575
|
+
session: CollaborationSession,
|
|
576
|
+
phase_name: str,
|
|
577
|
+
phase_config: Dict[str, Any],
|
|
578
|
+
) -> None:
|
|
579
|
+
"""
|
|
580
|
+
Execute a workflow phase.
|
|
581
|
+
|
|
582
|
+
Args:
|
|
583
|
+
session: Collaboration session
|
|
584
|
+
phase_name: Name of the phase
|
|
585
|
+
phase_config: Phase configuration
|
|
586
|
+
"""
|
|
587
|
+
logger.info(f"Executing phase '{phase_name}' for session {session.session_id}")
|
|
588
|
+
|
|
589
|
+
# Record phase execution
|
|
590
|
+
phase_result = {
|
|
591
|
+
"phase_name": phase_name,
|
|
592
|
+
"started_at": datetime.utcnow().isoformat(),
|
|
593
|
+
"config": phase_config,
|
|
594
|
+
"participants": session.participants,
|
|
595
|
+
"outputs": [],
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
# Simulate phase execution (in real implementation, this would
|
|
599
|
+
# coordinate agent activities)
|
|
600
|
+
phase_config.get("time_limit_minutes", 10)
|
|
601
|
+
await asyncio.sleep(1) # Simulate processing time
|
|
602
|
+
|
|
603
|
+
phase_result["completed_at"] = datetime.utcnow().isoformat()
|
|
604
|
+
phase_result["status"] = "completed"
|
|
605
|
+
|
|
606
|
+
# Store phase result in session metadata
|
|
607
|
+
if "phases" not in session.metadata:
|
|
608
|
+
session.metadata["phases"] = []
|
|
609
|
+
session.metadata["phases"].append(phase_result)
|
|
610
|
+
|
|
611
|
+
logger.info(f"Completed phase '{phase_name}' for session {session.session_id}")
|
|
612
|
+
|
|
613
|
+
async def end_session(self, session_id: str) -> Dict[str, Any]:
|
|
614
|
+
"""
|
|
615
|
+
End a collaborative session and generate summary.
|
|
616
|
+
|
|
617
|
+
Args:
|
|
618
|
+
session_id: ID of the session to end
|
|
619
|
+
|
|
620
|
+
Returns:
|
|
621
|
+
Session summary
|
|
622
|
+
"""
|
|
623
|
+
if session_id not in self.active_sessions:
|
|
624
|
+
raise TaskValidationError(f"Session not found: {session_id}")
|
|
625
|
+
|
|
626
|
+
session = self.active_sessions[session_id]
|
|
627
|
+
session.status = "completed"
|
|
628
|
+
session.ended_at = datetime.utcnow()
|
|
629
|
+
|
|
630
|
+
# Generate session summary
|
|
631
|
+
summary = {
|
|
632
|
+
"session_id": session_id,
|
|
633
|
+
"session_type": session.session_type,
|
|
634
|
+
"purpose": session.purpose,
|
|
635
|
+
"participants": session.participants,
|
|
636
|
+
"duration_minutes": (session.ended_at - session.started_at).total_seconds() / 60,
|
|
637
|
+
"outcomes": session.action_items,
|
|
638
|
+
"resources_created": session.resources_created,
|
|
639
|
+
"decisions_made": session.decisions_made,
|
|
640
|
+
"phases_completed": len(session.metadata.get("phases", [])),
|
|
641
|
+
"status": session.status,
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
# Remove from active sessions
|
|
645
|
+
del self.active_sessions[session_id]
|
|
646
|
+
|
|
647
|
+
logger.info(f"Ended collaborative session {session_id}")
|
|
648
|
+
return summary
|