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,479 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Agent Observability
|
|
3
|
+
|
|
4
|
+
Observer pattern and controllers for monitoring agent behavior.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Dict, Any, List, Protocol
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
|
|
11
|
+
from .base_agent import BaseAIAgent
|
|
12
|
+
from .models import AgentState
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AgentObserver(Protocol):
|
|
18
|
+
"""Protocol for observing agent events."""
|
|
19
|
+
|
|
20
|
+
def on_state_changed(
|
|
21
|
+
self,
|
|
22
|
+
agent_id: str,
|
|
23
|
+
old_state: AgentState,
|
|
24
|
+
new_state: AgentState,
|
|
25
|
+
timestamp: datetime,
|
|
26
|
+
) -> None:
|
|
27
|
+
"""
|
|
28
|
+
Called when agent state changes.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
agent_id: Agent identifier
|
|
32
|
+
old_state: Previous state
|
|
33
|
+
new_state: New state
|
|
34
|
+
timestamp: Change timestamp
|
|
35
|
+
"""
|
|
36
|
+
...
|
|
37
|
+
|
|
38
|
+
def on_task_started(
|
|
39
|
+
self,
|
|
40
|
+
agent_id: str,
|
|
41
|
+
task_id: str,
|
|
42
|
+
task: Dict[str, Any],
|
|
43
|
+
timestamp: datetime,
|
|
44
|
+
) -> None:
|
|
45
|
+
"""
|
|
46
|
+
Called when agent starts a task.
|
|
47
|
+
|
|
48
|
+
Args:
|
|
49
|
+
agent_id: Agent identifier
|
|
50
|
+
task_id: Task identifier
|
|
51
|
+
task: Task specification
|
|
52
|
+
timestamp: Start timestamp
|
|
53
|
+
"""
|
|
54
|
+
...
|
|
55
|
+
|
|
56
|
+
def on_task_completed(
|
|
57
|
+
self,
|
|
58
|
+
agent_id: str,
|
|
59
|
+
task_id: str,
|
|
60
|
+
result: Dict[str, Any],
|
|
61
|
+
timestamp: datetime,
|
|
62
|
+
) -> None:
|
|
63
|
+
"""
|
|
64
|
+
Called when agent completes a task.
|
|
65
|
+
|
|
66
|
+
Args:
|
|
67
|
+
agent_id: Agent identifier
|
|
68
|
+
task_id: Task identifier
|
|
69
|
+
result: Task result
|
|
70
|
+
timestamp: Completion timestamp
|
|
71
|
+
"""
|
|
72
|
+
...
|
|
73
|
+
|
|
74
|
+
def on_task_failed(
|
|
75
|
+
self,
|
|
76
|
+
agent_id: str,
|
|
77
|
+
task_id: str,
|
|
78
|
+
error: Exception,
|
|
79
|
+
timestamp: datetime,
|
|
80
|
+
) -> None:
|
|
81
|
+
"""
|
|
82
|
+
Called when agent task fails.
|
|
83
|
+
|
|
84
|
+
Args:
|
|
85
|
+
agent_id: Agent identifier
|
|
86
|
+
task_id: Task identifier
|
|
87
|
+
error: Error that occurred
|
|
88
|
+
timestamp: Failure timestamp
|
|
89
|
+
"""
|
|
90
|
+
...
|
|
91
|
+
|
|
92
|
+
def on_health_status_changed(
|
|
93
|
+
self,
|
|
94
|
+
agent_id: str,
|
|
95
|
+
health_status: Dict[str, Any],
|
|
96
|
+
timestamp: datetime,
|
|
97
|
+
) -> None:
|
|
98
|
+
"""
|
|
99
|
+
Called when agent health status changes significantly.
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
agent_id: Agent identifier
|
|
103
|
+
health_status: Health status dictionary with score and issues
|
|
104
|
+
timestamp: Status change timestamp
|
|
105
|
+
"""
|
|
106
|
+
...
|
|
107
|
+
|
|
108
|
+
def on_tool_called(
|
|
109
|
+
self,
|
|
110
|
+
agent_id: str,
|
|
111
|
+
tool_name: str,
|
|
112
|
+
parameters: Dict[str, Any],
|
|
113
|
+
timestamp: datetime,
|
|
114
|
+
) -> None:
|
|
115
|
+
"""
|
|
116
|
+
Called when agent calls a tool.
|
|
117
|
+
|
|
118
|
+
Args:
|
|
119
|
+
agent_id: Agent identifier
|
|
120
|
+
tool_name: Tool name
|
|
121
|
+
parameters: Tool parameters
|
|
122
|
+
timestamp: Call timestamp
|
|
123
|
+
"""
|
|
124
|
+
...
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class LoggingObserver:
|
|
128
|
+
"""Observer that logs agent events."""
|
|
129
|
+
|
|
130
|
+
def __init__(self, log_level: int = logging.INFO):
|
|
131
|
+
"""
|
|
132
|
+
Initialize logging observer.
|
|
133
|
+
|
|
134
|
+
Args:
|
|
135
|
+
log_level: Logging level
|
|
136
|
+
"""
|
|
137
|
+
self.logger = logging.getLogger(f"{__name__}.LoggingObserver")
|
|
138
|
+
self.log_level = log_level
|
|
139
|
+
|
|
140
|
+
def on_state_changed(
|
|
141
|
+
self,
|
|
142
|
+
agent_id: str,
|
|
143
|
+
old_state: AgentState,
|
|
144
|
+
new_state: AgentState,
|
|
145
|
+
timestamp: datetime,
|
|
146
|
+
) -> None:
|
|
147
|
+
"""Log state change."""
|
|
148
|
+
self.logger.log(
|
|
149
|
+
self.log_level,
|
|
150
|
+
f"Agent {agent_id}: {old_state.value} → {new_state.value}",
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
def on_task_started(
|
|
154
|
+
self,
|
|
155
|
+
agent_id: str,
|
|
156
|
+
task_id: str,
|
|
157
|
+
task: Dict[str, Any],
|
|
158
|
+
timestamp: datetime,
|
|
159
|
+
) -> None:
|
|
160
|
+
"""Log task start."""
|
|
161
|
+
self.logger.log(self.log_level, f"Agent {agent_id}: Task {task_id} started")
|
|
162
|
+
|
|
163
|
+
def on_task_completed(
|
|
164
|
+
self,
|
|
165
|
+
agent_id: str,
|
|
166
|
+
task_id: str,
|
|
167
|
+
result: Dict[str, Any],
|
|
168
|
+
timestamp: datetime,
|
|
169
|
+
) -> None:
|
|
170
|
+
"""Log task completion."""
|
|
171
|
+
self.logger.log(self.log_level, f"Agent {agent_id}: Task {task_id} completed")
|
|
172
|
+
|
|
173
|
+
def on_task_failed(
|
|
174
|
+
self,
|
|
175
|
+
agent_id: str,
|
|
176
|
+
task_id: str,
|
|
177
|
+
error: Exception,
|
|
178
|
+
timestamp: datetime,
|
|
179
|
+
) -> None:
|
|
180
|
+
"""Log task failure."""
|
|
181
|
+
self.logger.log(
|
|
182
|
+
self.log_level,
|
|
183
|
+
f"Agent {agent_id}: Task {task_id} failed - {str(error)}",
|
|
184
|
+
)
|
|
185
|
+
|
|
186
|
+
def on_tool_called(
|
|
187
|
+
self,
|
|
188
|
+
agent_id: str,
|
|
189
|
+
tool_name: str,
|
|
190
|
+
parameters: Dict[str, Any],
|
|
191
|
+
timestamp: datetime,
|
|
192
|
+
) -> None:
|
|
193
|
+
"""Log tool call."""
|
|
194
|
+
self.logger.log(self.log_level, f"Agent {agent_id}: Tool '{tool_name}' called")
|
|
195
|
+
|
|
196
|
+
def on_health_status_changed(
|
|
197
|
+
self,
|
|
198
|
+
agent_id: str,
|
|
199
|
+
health_status: Dict[str, Any],
|
|
200
|
+
timestamp: datetime,
|
|
201
|
+
) -> None:
|
|
202
|
+
"""Log health status change."""
|
|
203
|
+
status = health_status.get("status", "unknown")
|
|
204
|
+
score = health_status.get("health_score", 0)
|
|
205
|
+
issues = health_status.get("issues", [])
|
|
206
|
+
|
|
207
|
+
log_level = self.log_level
|
|
208
|
+
if status == "unhealthy":
|
|
209
|
+
log_level = logging.WARNING
|
|
210
|
+
elif status == "degraded":
|
|
211
|
+
log_level = logging.INFO
|
|
212
|
+
|
|
213
|
+
message = f"Agent {agent_id}: Health status {status} (score: {score:.1f}/100)"
|
|
214
|
+
if issues:
|
|
215
|
+
message += f" - Issues: {', '.join(issues)}"
|
|
216
|
+
|
|
217
|
+
self.logger.log(log_level, message)
|
|
218
|
+
|
|
219
|
+
|
|
220
|
+
class MetricsObserver:
|
|
221
|
+
"""Observer that collects metrics."""
|
|
222
|
+
|
|
223
|
+
def __init__(self) -> None:
|
|
224
|
+
"""Initialize metrics observer."""
|
|
225
|
+
self.state_changes: List[Dict[str, Any]] = []
|
|
226
|
+
self.task_events: List[Dict[str, Any]] = []
|
|
227
|
+
self.tool_calls: List[Dict[str, Any]] = []
|
|
228
|
+
self.health_status_changes: List[Dict[str, Any]] = []
|
|
229
|
+
|
|
230
|
+
def on_state_changed(
|
|
231
|
+
self,
|
|
232
|
+
agent_id: str,
|
|
233
|
+
old_state: AgentState,
|
|
234
|
+
new_state: AgentState,
|
|
235
|
+
timestamp: datetime,
|
|
236
|
+
) -> None:
|
|
237
|
+
"""Record state change."""
|
|
238
|
+
self.state_changes.append(
|
|
239
|
+
{
|
|
240
|
+
"agent_id": agent_id,
|
|
241
|
+
"old_state": old_state.value,
|
|
242
|
+
"new_state": new_state.value,
|
|
243
|
+
"timestamp": timestamp.isoformat(),
|
|
244
|
+
}
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
def on_task_started(
|
|
248
|
+
self,
|
|
249
|
+
agent_id: str,
|
|
250
|
+
task_id: str,
|
|
251
|
+
task: Dict[str, Any],
|
|
252
|
+
timestamp: datetime,
|
|
253
|
+
) -> None:
|
|
254
|
+
"""Record task start."""
|
|
255
|
+
self.task_events.append(
|
|
256
|
+
{
|
|
257
|
+
"agent_id": agent_id,
|
|
258
|
+
"task_id": task_id,
|
|
259
|
+
"event": "started",
|
|
260
|
+
"timestamp": timestamp.isoformat(),
|
|
261
|
+
}
|
|
262
|
+
)
|
|
263
|
+
|
|
264
|
+
def on_task_completed(
|
|
265
|
+
self,
|
|
266
|
+
agent_id: str,
|
|
267
|
+
task_id: str,
|
|
268
|
+
result: Dict[str, Any],
|
|
269
|
+
timestamp: datetime,
|
|
270
|
+
) -> None:
|
|
271
|
+
"""Record task completion."""
|
|
272
|
+
self.task_events.append(
|
|
273
|
+
{
|
|
274
|
+
"agent_id": agent_id,
|
|
275
|
+
"task_id": task_id,
|
|
276
|
+
"event": "completed",
|
|
277
|
+
"timestamp": timestamp.isoformat(),
|
|
278
|
+
}
|
|
279
|
+
)
|
|
280
|
+
|
|
281
|
+
def on_task_failed(
|
|
282
|
+
self,
|
|
283
|
+
agent_id: str,
|
|
284
|
+
task_id: str,
|
|
285
|
+
error: Exception,
|
|
286
|
+
timestamp: datetime,
|
|
287
|
+
) -> None:
|
|
288
|
+
"""Record task failure."""
|
|
289
|
+
self.task_events.append(
|
|
290
|
+
{
|
|
291
|
+
"agent_id": agent_id,
|
|
292
|
+
"task_id": task_id,
|
|
293
|
+
"event": "failed",
|
|
294
|
+
"error": str(error),
|
|
295
|
+
"timestamp": timestamp.isoformat(),
|
|
296
|
+
}
|
|
297
|
+
)
|
|
298
|
+
|
|
299
|
+
def on_tool_called(
|
|
300
|
+
self,
|
|
301
|
+
agent_id: str,
|
|
302
|
+
tool_name: str,
|
|
303
|
+
parameters: Dict[str, Any],
|
|
304
|
+
timestamp: datetime,
|
|
305
|
+
) -> None:
|
|
306
|
+
"""Record tool call."""
|
|
307
|
+
self.tool_calls.append(
|
|
308
|
+
{
|
|
309
|
+
"agent_id": agent_id,
|
|
310
|
+
"tool_name": tool_name,
|
|
311
|
+
"timestamp": timestamp.isoformat(),
|
|
312
|
+
}
|
|
313
|
+
)
|
|
314
|
+
|
|
315
|
+
def on_health_status_changed(
|
|
316
|
+
self,
|
|
317
|
+
agent_id: str,
|
|
318
|
+
health_status: Dict[str, Any],
|
|
319
|
+
timestamp: datetime,
|
|
320
|
+
) -> None:
|
|
321
|
+
"""Record health status change."""
|
|
322
|
+
self.health_status_changes.append(
|
|
323
|
+
{
|
|
324
|
+
"agent_id": agent_id,
|
|
325
|
+
"status": health_status.get("status"),
|
|
326
|
+
"health_score": health_status.get("health_score"),
|
|
327
|
+
"issues": health_status.get("issues", []),
|
|
328
|
+
"timestamp": timestamp.isoformat(),
|
|
329
|
+
}
|
|
330
|
+
)
|
|
331
|
+
|
|
332
|
+
def get_metrics(self) -> Dict[str, Any]:
|
|
333
|
+
"""Get collected metrics."""
|
|
334
|
+
return {
|
|
335
|
+
"state_changes": len(self.state_changes),
|
|
336
|
+
"task_events": len(self.task_events),
|
|
337
|
+
"tool_calls": len(self.tool_calls),
|
|
338
|
+
"health_status_changes": len(self.health_status_changes),
|
|
339
|
+
"state_changes_data": self.state_changes,
|
|
340
|
+
"task_events_data": self.task_events,
|
|
341
|
+
"tool_calls_data": self.tool_calls,
|
|
342
|
+
"health_status_changes_data": self.health_status_changes,
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
def clear(self) -> None:
|
|
346
|
+
"""Clear all metrics."""
|
|
347
|
+
self.state_changes.clear()
|
|
348
|
+
self.task_events.clear()
|
|
349
|
+
self.tool_calls.clear()
|
|
350
|
+
self.health_status_changes.clear()
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
class AgentController:
|
|
354
|
+
"""
|
|
355
|
+
Controller for managing agent execution and monitoring.
|
|
356
|
+
|
|
357
|
+
Integrates with observers for event tracking.
|
|
358
|
+
"""
|
|
359
|
+
|
|
360
|
+
def __init__(self, agent: BaseAIAgent):
|
|
361
|
+
"""
|
|
362
|
+
Initialize agent controller.
|
|
363
|
+
|
|
364
|
+
Args:
|
|
365
|
+
agent: Agent to control
|
|
366
|
+
"""
|
|
367
|
+
self.agent = agent
|
|
368
|
+
self.observers: List[AgentObserver] = []
|
|
369
|
+
logger.info(f"AgentController initialized for agent {agent.agent_id}")
|
|
370
|
+
|
|
371
|
+
def add_observer(self, observer: AgentObserver) -> None:
|
|
372
|
+
"""
|
|
373
|
+
Add an observer.
|
|
374
|
+
|
|
375
|
+
Args:
|
|
376
|
+
observer: Observer to add
|
|
377
|
+
"""
|
|
378
|
+
self.observers.append(observer)
|
|
379
|
+
logger.debug(f"Observer added to agent {self.agent.agent_id}")
|
|
380
|
+
|
|
381
|
+
def remove_observer(self, observer: AgentObserver) -> None:
|
|
382
|
+
"""
|
|
383
|
+
Remove an observer.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
observer: Observer to remove
|
|
387
|
+
"""
|
|
388
|
+
if observer in self.observers:
|
|
389
|
+
self.observers.remove(observer)
|
|
390
|
+
logger.debug(f"Observer removed from agent {self.agent.agent_id}")
|
|
391
|
+
|
|
392
|
+
def notify_state_changed(self, old_state: AgentState, new_state: AgentState) -> None:
|
|
393
|
+
"""Notify observers of state change."""
|
|
394
|
+
timestamp = datetime.utcnow()
|
|
395
|
+
for observer in self.observers:
|
|
396
|
+
try:
|
|
397
|
+
observer.on_state_changed(self.agent.agent_id, old_state, new_state, timestamp)
|
|
398
|
+
except Exception as e:
|
|
399
|
+
logger.error(f"Observer notification failed: {e}")
|
|
400
|
+
|
|
401
|
+
def notify_task_started(self, task_id: str, task: Dict[str, Any]) -> None:
|
|
402
|
+
"""Notify observers of task start."""
|
|
403
|
+
timestamp = datetime.utcnow()
|
|
404
|
+
for observer in self.observers:
|
|
405
|
+
try:
|
|
406
|
+
observer.on_task_started(self.agent.agent_id, task_id, task, timestamp)
|
|
407
|
+
except Exception as e:
|
|
408
|
+
logger.error(f"Observer notification failed: {e}")
|
|
409
|
+
|
|
410
|
+
def notify_task_completed(self, task_id: str, result: Dict[str, Any]) -> None:
|
|
411
|
+
"""Notify observers of task completion."""
|
|
412
|
+
timestamp = datetime.utcnow()
|
|
413
|
+
for observer in self.observers:
|
|
414
|
+
try:
|
|
415
|
+
observer.on_task_completed(self.agent.agent_id, task_id, result, timestamp)
|
|
416
|
+
except Exception as e:
|
|
417
|
+
logger.error(f"Observer notification failed: {e}")
|
|
418
|
+
|
|
419
|
+
def notify_task_failed(self, task_id: str, error: Exception) -> None:
|
|
420
|
+
"""Notify observers of task failure."""
|
|
421
|
+
timestamp = datetime.utcnow()
|
|
422
|
+
for observer in self.observers:
|
|
423
|
+
try:
|
|
424
|
+
observer.on_task_failed(self.agent.agent_id, task_id, error, timestamp)
|
|
425
|
+
except Exception as e:
|
|
426
|
+
logger.error(f"Observer notification failed: {e}")
|
|
427
|
+
|
|
428
|
+
def notify_tool_called(self, tool_name: str, parameters: Dict[str, Any]) -> None:
|
|
429
|
+
"""Notify observers of tool call."""
|
|
430
|
+
timestamp = datetime.utcnow()
|
|
431
|
+
for observer in self.observers:
|
|
432
|
+
try:
|
|
433
|
+
observer.on_tool_called(self.agent.agent_id, tool_name, parameters, timestamp)
|
|
434
|
+
except Exception as e:
|
|
435
|
+
logger.error(f"Observer notification failed: {e}")
|
|
436
|
+
|
|
437
|
+
def notify_health_status_changed(self, health_status: Dict[str, Any]) -> None:
|
|
438
|
+
"""
|
|
439
|
+
Notify observers of health status change.
|
|
440
|
+
|
|
441
|
+
Args:
|
|
442
|
+
health_status: Health status dictionary with score and issues
|
|
443
|
+
"""
|
|
444
|
+
timestamp = datetime.utcnow()
|
|
445
|
+
for observer in self.observers:
|
|
446
|
+
try:
|
|
447
|
+
observer.on_health_status_changed(self.agent.agent_id, health_status, timestamp)
|
|
448
|
+
except Exception as e:
|
|
449
|
+
logger.error(f"Observer notification failed: {e}")
|
|
450
|
+
|
|
451
|
+
async def execute_task_with_observation(self, task: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]:
|
|
452
|
+
"""
|
|
453
|
+
Execute task with observer notifications.
|
|
454
|
+
|
|
455
|
+
Args:
|
|
456
|
+
task: Task specification
|
|
457
|
+
context: Execution context
|
|
458
|
+
|
|
459
|
+
Returns:
|
|
460
|
+
Task result
|
|
461
|
+
"""
|
|
462
|
+
task_id = task.get("task_id", f"task_{datetime.utcnow().timestamp()}")
|
|
463
|
+
|
|
464
|
+
# Notify start
|
|
465
|
+
self.notify_task_started(task_id, task)
|
|
466
|
+
|
|
467
|
+
try:
|
|
468
|
+
# Execute task
|
|
469
|
+
result = await self.agent.execute_task(task, context)
|
|
470
|
+
|
|
471
|
+
# Notify completion
|
|
472
|
+
self.notify_task_completed(task_id, result)
|
|
473
|
+
|
|
474
|
+
return result
|
|
475
|
+
|
|
476
|
+
except Exception as e:
|
|
477
|
+
# Notify failure
|
|
478
|
+
self.notify_task_failed(task_id, e)
|
|
479
|
+
raise
|