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
|
@@ -14,9 +14,11 @@ from datetime import datetime
|
|
|
14
14
|
@dataclass
|
|
15
15
|
class ConversationParticipant:
|
|
16
16
|
"""Represents a participant in a conversation."""
|
|
17
|
+
|
|
17
18
|
participant_id: str
|
|
18
19
|
participant_type: str # 'user', 'master_controller', 'agent'
|
|
19
|
-
|
|
20
|
+
# For agents: 'writer', 'researcher', etc.
|
|
21
|
+
participant_role: Optional[str] = None
|
|
20
22
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
21
23
|
|
|
22
24
|
def __post_init__(self):
|
|
@@ -27,18 +29,19 @@ class ConversationParticipant:
|
|
|
27
29
|
raise ValueError("participant_type cannot be empty")
|
|
28
30
|
|
|
29
31
|
# Validate participant types
|
|
30
|
-
valid_types = {
|
|
32
|
+
valid_types = {"user", "master_controller", "agent"}
|
|
31
33
|
if self.participant_type not in valid_types:
|
|
32
34
|
raise ValueError(f"participant_type must be one of {valid_types}")
|
|
33
35
|
|
|
34
36
|
# For agents, role should be specified
|
|
35
|
-
if self.participant_type ==
|
|
37
|
+
if self.participant_type == "agent" and not self.participant_role:
|
|
36
38
|
raise ValueError("participant_role is required for agent participants")
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
@dataclass
|
|
40
42
|
class ConversationSession:
|
|
41
43
|
"""Represents an isolated conversation session between participants."""
|
|
44
|
+
|
|
42
45
|
session_id: str
|
|
43
46
|
participants: List[ConversationParticipant]
|
|
44
47
|
session_type: str # 'user_to_mc', 'mc_to_agent', 'agent_to_agent', 'user_to_agent'
|
|
@@ -54,7 +57,12 @@ class ConversationSession:
|
|
|
54
57
|
raise ValueError("participants list cannot be empty")
|
|
55
58
|
|
|
56
59
|
# Validate session types
|
|
57
|
-
valid_session_types = {
|
|
60
|
+
valid_session_types = {
|
|
61
|
+
"user_to_mc",
|
|
62
|
+
"mc_to_agent",
|
|
63
|
+
"agent_to_agent",
|
|
64
|
+
"user_to_agent",
|
|
65
|
+
}
|
|
58
66
|
if self.session_type not in valid_session_types:
|
|
59
67
|
raise ValueError(f"session_type must be one of {valid_session_types}")
|
|
60
68
|
|
|
@@ -65,40 +73,46 @@ class ConversationSession:
|
|
|
65
73
|
"""Validate that participants match the session type."""
|
|
66
74
|
participant_types = [p.participant_type for p in self.participants]
|
|
67
75
|
|
|
68
|
-
if self.session_type ==
|
|
69
|
-
expected_types = {
|
|
76
|
+
if self.session_type == "user_to_mc":
|
|
77
|
+
expected_types = {"user", "master_controller"}
|
|
70
78
|
if not expected_types.issubset(set(participant_types)):
|
|
71
|
-
raise ValueError(
|
|
79
|
+
raise ValueError("user_to_mc session requires user and master_controller participants")
|
|
72
80
|
|
|
73
|
-
elif self.session_type ==
|
|
74
|
-
expected_types = {
|
|
81
|
+
elif self.session_type == "mc_to_agent":
|
|
82
|
+
expected_types = {"master_controller", "agent"}
|
|
75
83
|
if not expected_types.issubset(set(participant_types)):
|
|
76
|
-
raise ValueError(
|
|
84
|
+
raise ValueError("mc_to_agent session requires master_controller and agent participants")
|
|
77
85
|
|
|
78
|
-
elif self.session_type ==
|
|
79
|
-
agent_count = sum(1 for p in self.participants if p.participant_type ==
|
|
86
|
+
elif self.session_type == "agent_to_agent":
|
|
87
|
+
agent_count = sum(1 for p in self.participants if p.participant_type == "agent")
|
|
80
88
|
if agent_count < 2:
|
|
81
|
-
raise ValueError(
|
|
89
|
+
raise ValueError("agent_to_agent session requires at least 2 agent participants")
|
|
82
90
|
|
|
83
|
-
elif self.session_type ==
|
|
84
|
-
expected_types = {
|
|
91
|
+
elif self.session_type == "user_to_agent":
|
|
92
|
+
expected_types = {"user", "agent"}
|
|
85
93
|
if not expected_types.issubset(set(participant_types)):
|
|
86
|
-
raise ValueError(
|
|
94
|
+
raise ValueError("user_to_agent session requires user and agent participants")
|
|
87
95
|
|
|
88
96
|
def generate_session_key(self) -> str:
|
|
89
97
|
"""Generate a unique session key for conversation isolation."""
|
|
90
|
-
if self.session_type ==
|
|
98
|
+
if self.session_type == "user_to_mc":
|
|
91
99
|
return self.session_id
|
|
92
|
-
elif self.session_type ==
|
|
93
|
-
agent_role = next(
|
|
100
|
+
elif self.session_type == "mc_to_agent":
|
|
101
|
+
agent_role = next(
|
|
102
|
+
(p.participant_role for p in self.participants if p.participant_type == "agent"),
|
|
103
|
+
"unknown",
|
|
104
|
+
)
|
|
94
105
|
return f"{self.session_id}_mc_to_{agent_role}"
|
|
95
|
-
elif self.session_type ==
|
|
96
|
-
agent_roles = [p.participant_role for p in self.participants if p.participant_type ==
|
|
106
|
+
elif self.session_type == "agent_to_agent":
|
|
107
|
+
agent_roles = [p.participant_role for p in self.participants if p.participant_type == "agent"]
|
|
97
108
|
if len(agent_roles) >= 2:
|
|
98
109
|
return f"{self.session_id}_{agent_roles[0]}_to_{agent_roles[1]}"
|
|
99
110
|
return f"{self.session_id}_agent_to_agent"
|
|
100
|
-
elif self.session_type ==
|
|
101
|
-
agent_role = next(
|
|
111
|
+
elif self.session_type == "user_to_agent":
|
|
112
|
+
agent_role = next(
|
|
113
|
+
(p.participant_role for p in self.participants if p.participant_type == "agent"),
|
|
114
|
+
"unknown",
|
|
115
|
+
)
|
|
102
116
|
return f"{self.session_id}_user_to_{agent_role}"
|
|
103
117
|
else:
|
|
104
118
|
return self.session_id
|
|
@@ -124,25 +138,25 @@ class ConversationSession:
|
|
|
124
138
|
"participant_id": p.participant_id,
|
|
125
139
|
"participant_type": p.participant_type,
|
|
126
140
|
"participant_role": p.participant_role,
|
|
127
|
-
"metadata": p.metadata
|
|
141
|
+
"metadata": p.metadata,
|
|
128
142
|
}
|
|
129
143
|
for p in self.participants
|
|
130
144
|
],
|
|
131
145
|
"session_type": self.session_type,
|
|
132
146
|
"created_at": self.created_at.isoformat(),
|
|
133
147
|
"last_activity": self.last_activity.isoformat(),
|
|
134
|
-
"metadata": self.metadata
|
|
148
|
+
"metadata": self.metadata,
|
|
135
149
|
}
|
|
136
150
|
|
|
137
151
|
@classmethod
|
|
138
|
-
def from_dict(cls, data: Dict[str, Any]) ->
|
|
152
|
+
def from_dict(cls, data: Dict[str, Any]) -> "ConversationSession":
|
|
139
153
|
"""Create from dictionary."""
|
|
140
154
|
participants = [
|
|
141
155
|
ConversationParticipant(
|
|
142
156
|
participant_id=p["participant_id"],
|
|
143
157
|
participant_type=p["participant_type"],
|
|
144
158
|
participant_role=p.get("participant_role"),
|
|
145
|
-
metadata=p.get("metadata", {})
|
|
159
|
+
metadata=p.get("metadata", {}),
|
|
146
160
|
)
|
|
147
161
|
for p in data["participants"]
|
|
148
162
|
]
|
|
@@ -153,13 +167,14 @@ class ConversationSession:
|
|
|
153
167
|
session_type=data["session_type"],
|
|
154
168
|
created_at=datetime.fromisoformat(data["created_at"]),
|
|
155
169
|
last_activity=datetime.fromisoformat(data["last_activity"]),
|
|
156
|
-
metadata=data.get("metadata", {})
|
|
170
|
+
metadata=data.get("metadata", {}),
|
|
157
171
|
)
|
|
158
172
|
|
|
159
173
|
|
|
160
174
|
@dataclass
|
|
161
175
|
class AgentCommunicationMessage:
|
|
162
176
|
"""Message for agent-to-agent or controller-to-agent communication."""
|
|
177
|
+
|
|
163
178
|
message_id: str
|
|
164
179
|
session_key: str
|
|
165
180
|
sender_id: str
|
|
@@ -169,7 +184,8 @@ class AgentCommunicationMessage:
|
|
|
169
184
|
recipient_type: str # 'agent', 'master_controller', 'user'
|
|
170
185
|
recipient_role: Optional[str] # For agents
|
|
171
186
|
content: str
|
|
172
|
-
|
|
187
|
+
# 'task_assignment', 'result_report', 'collaboration_request', 'feedback', 'communication'
|
|
188
|
+
message_type: str
|
|
173
189
|
timestamp: datetime
|
|
174
190
|
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
175
191
|
|
|
@@ -188,9 +204,16 @@ class AgentCommunicationMessage:
|
|
|
188
204
|
|
|
189
205
|
# Validate message types
|
|
190
206
|
valid_message_types = {
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
207
|
+
"task_assignment",
|
|
208
|
+
"result_report",
|
|
209
|
+
"collaboration_request",
|
|
210
|
+
"feedback",
|
|
211
|
+
"communication",
|
|
212
|
+
"status_update",
|
|
213
|
+
"error_report",
|
|
214
|
+
"task_completion",
|
|
215
|
+
"progress_update",
|
|
216
|
+
"clarification_request",
|
|
194
217
|
}
|
|
195
218
|
if self.message_type not in valid_message_types:
|
|
196
219
|
raise ValueError(f"message_type must be one of {valid_message_types}")
|
|
@@ -211,8 +234,8 @@ class AgentCommunicationMessage:
|
|
|
211
234
|
"recipient_id": self.recipient_id,
|
|
212
235
|
"recipient_type": self.recipient_type,
|
|
213
236
|
"recipient_role": self.recipient_role,
|
|
214
|
-
"message_type": self.message_type
|
|
215
|
-
}
|
|
237
|
+
"message_type": self.message_type,
|
|
238
|
+
},
|
|
216
239
|
}
|
|
217
240
|
|
|
218
241
|
def to_dict(self) -> Dict[str, Any]:
|
|
@@ -229,11 +252,11 @@ class AgentCommunicationMessage:
|
|
|
229
252
|
"content": self.content,
|
|
230
253
|
"message_type": self.message_type,
|
|
231
254
|
"timestamp": self.timestamp.isoformat(),
|
|
232
|
-
"metadata": self.metadata
|
|
255
|
+
"metadata": self.metadata,
|
|
233
256
|
}
|
|
234
257
|
|
|
235
258
|
@classmethod
|
|
236
|
-
def from_dict(cls, data: Dict[str, Any]) ->
|
|
259
|
+
def from_dict(cls, data: Dict[str, Any]) -> "AgentCommunicationMessage":
|
|
237
260
|
"""Create from dictionary."""
|
|
238
261
|
return cls(
|
|
239
262
|
message_id=data["message_id"],
|
|
@@ -247,13 +270,18 @@ class AgentCommunicationMessage:
|
|
|
247
270
|
content=data["content"],
|
|
248
271
|
message_type=data["message_type"],
|
|
249
272
|
timestamp=datetime.fromisoformat(data["timestamp"]),
|
|
250
|
-
metadata=data.get("metadata", {})
|
|
273
|
+
metadata=data.get("metadata", {}),
|
|
251
274
|
)
|
|
252
275
|
|
|
253
276
|
|
|
254
277
|
# Conversation isolation utility functions
|
|
255
278
|
|
|
256
|
-
|
|
279
|
+
|
|
280
|
+
def create_session_key(
|
|
281
|
+
session_id: str,
|
|
282
|
+
session_type: str,
|
|
283
|
+
participants: List[ConversationParticipant],
|
|
284
|
+
) -> str:
|
|
257
285
|
"""
|
|
258
286
|
Utility function to create session keys for conversation isolation.
|
|
259
287
|
|
|
@@ -265,18 +293,24 @@ def create_session_key(session_id: str, session_type: str, participants: List[Co
|
|
|
265
293
|
Returns:
|
|
266
294
|
Generated session key
|
|
267
295
|
"""
|
|
268
|
-
if session_type ==
|
|
296
|
+
if session_type == "user_to_mc":
|
|
269
297
|
return session_id
|
|
270
|
-
elif session_type ==
|
|
271
|
-
agent_role = next(
|
|
298
|
+
elif session_type == "mc_to_agent":
|
|
299
|
+
agent_role = next(
|
|
300
|
+
(p.participant_role for p in participants if p.participant_type == "agent"),
|
|
301
|
+
"unknown",
|
|
302
|
+
)
|
|
272
303
|
return f"{session_id}_mc_to_{agent_role}"
|
|
273
|
-
elif session_type ==
|
|
274
|
-
agent_roles = [p.participant_role for p in participants if p.participant_type ==
|
|
304
|
+
elif session_type == "agent_to_agent":
|
|
305
|
+
agent_roles = [p.participant_role for p in participants if p.participant_type == "agent"]
|
|
275
306
|
if len(agent_roles) >= 2:
|
|
276
307
|
return f"{session_id}_{agent_roles[0]}_to_{agent_roles[1]}"
|
|
277
308
|
return f"{session_id}_agent_to_agent"
|
|
278
|
-
elif session_type ==
|
|
279
|
-
agent_role = next(
|
|
309
|
+
elif session_type == "user_to_agent":
|
|
310
|
+
agent_role = next(
|
|
311
|
+
(p.participant_role for p in participants if p.participant_type == "agent"),
|
|
312
|
+
"unknown",
|
|
313
|
+
)
|
|
280
314
|
return f"{session_id}_user_to_{agent_role}"
|
|
281
315
|
else:
|
|
282
316
|
return session_id
|
|
@@ -293,14 +327,14 @@ def validate_conversation_isolation_pattern(session_key: str, expected_pattern:
|
|
|
293
327
|
Returns:
|
|
294
328
|
True if the pattern matches, False otherwise
|
|
295
329
|
"""
|
|
296
|
-
if expected_pattern ==
|
|
330
|
+
if expected_pattern == "user_to_mc":
|
|
297
331
|
# Should be just the base session_id
|
|
298
|
-
return
|
|
299
|
-
elif expected_pattern ==
|
|
300
|
-
return
|
|
301
|
-
elif expected_pattern ==
|
|
302
|
-
return
|
|
303
|
-
elif expected_pattern ==
|
|
304
|
-
return
|
|
332
|
+
return "_" not in session_key or not any(x in session_key for x in ["_mc_to_", "_to_", "_user_to_"])
|
|
333
|
+
elif expected_pattern == "mc_to_agent":
|
|
334
|
+
return "_mc_to_" in session_key
|
|
335
|
+
elif expected_pattern == "agent_to_agent":
|
|
336
|
+
return "_to_" in session_key and "_mc_to_" not in session_key and "_user_to_" not in session_key
|
|
337
|
+
elif expected_pattern == "user_to_agent":
|
|
338
|
+
return "_user_to_" in session_key
|
|
305
339
|
else:
|
|
306
340
|
return False
|