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,12 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph Profiling
|
|
3
|
+
|
|
4
|
+
Performance profiling and analysis tools for knowledge graph operations.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aiecs.application.knowledge_graph.profiling.query_profiler import (
|
|
8
|
+
QueryProfiler,
|
|
9
|
+
QueryProfile,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = ["QueryProfiler", "QueryProfile"]
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Query Plan Visualizer
|
|
3
|
+
|
|
4
|
+
Visualize query execution plans and performance profiles.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Dict, Any, List
|
|
8
|
+
from aiecs.application.knowledge_graph.profiling.query_profiler import (
|
|
9
|
+
QueryProfile,
|
|
10
|
+
)
|
|
11
|
+
from aiecs.domain.knowledge_graph.models.query_plan import QueryPlan
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class QueryPlanVisualizer:
|
|
15
|
+
"""
|
|
16
|
+
Visualize query plans and execution profiles
|
|
17
|
+
|
|
18
|
+
Generates text-based visualizations of query plans and performance data.
|
|
19
|
+
|
|
20
|
+
Example:
|
|
21
|
+
```python
|
|
22
|
+
visualizer = QueryPlanVisualizer()
|
|
23
|
+
|
|
24
|
+
# Visualize query plan
|
|
25
|
+
plan_viz = visualizer.visualize_plan(query_plan)
|
|
26
|
+
print(plan_viz)
|
|
27
|
+
|
|
28
|
+
# Visualize execution profile
|
|
29
|
+
profile_viz = visualizer.visualize_profile(query_profile)
|
|
30
|
+
print(profile_viz)
|
|
31
|
+
```
|
|
32
|
+
"""
|
|
33
|
+
|
|
34
|
+
def visualize_plan(self, plan: QueryPlan, show_costs: bool = True) -> str:
|
|
35
|
+
"""
|
|
36
|
+
Visualize a query plan
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
plan: Query plan to visualize
|
|
40
|
+
show_costs: Whether to show cost estimates
|
|
41
|
+
|
|
42
|
+
Returns:
|
|
43
|
+
Text visualization of the plan
|
|
44
|
+
"""
|
|
45
|
+
lines = []
|
|
46
|
+
lines.append("=" * 60)
|
|
47
|
+
lines.append("QUERY PLAN")
|
|
48
|
+
lines.append("=" * 60)
|
|
49
|
+
|
|
50
|
+
if show_costs:
|
|
51
|
+
total_cost = plan.calculate_total_cost()
|
|
52
|
+
lines.append(f"Total Estimated Cost: {total_cost:.2f}")
|
|
53
|
+
lines.append("")
|
|
54
|
+
|
|
55
|
+
for i, step in enumerate(plan.steps, 1):
|
|
56
|
+
lines.append(f"Step {i}: {step.operation.value}")
|
|
57
|
+
lines.append(f" Description: {step.description}")
|
|
58
|
+
|
|
59
|
+
if show_costs:
|
|
60
|
+
lines.append(f" Estimated Cost: {step.estimated_cost:.2f}")
|
|
61
|
+
|
|
62
|
+
if step.depends_on:
|
|
63
|
+
lines.append(f" Depends On: {', '.join(step.depends_on)}")
|
|
64
|
+
|
|
65
|
+
if step.metadata:
|
|
66
|
+
lines.append(f" Metadata: {step.metadata}")
|
|
67
|
+
|
|
68
|
+
lines.append("")
|
|
69
|
+
|
|
70
|
+
lines.append("=" * 60)
|
|
71
|
+
return "\n".join(lines)
|
|
72
|
+
|
|
73
|
+
def visualize_profile(self, profile: QueryProfile, show_steps: bool = True) -> str:
|
|
74
|
+
"""
|
|
75
|
+
Visualize a query execution profile
|
|
76
|
+
|
|
77
|
+
Args:
|
|
78
|
+
profile: Query profile to visualize
|
|
79
|
+
show_steps: Whether to show individual steps
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
Text visualization of the profile
|
|
83
|
+
"""
|
|
84
|
+
lines = []
|
|
85
|
+
lines.append("=" * 60)
|
|
86
|
+
lines.append("QUERY EXECUTION PROFILE")
|
|
87
|
+
lines.append("=" * 60)
|
|
88
|
+
lines.append(f"Query ID: {profile.query_id}")
|
|
89
|
+
lines.append(f"Query Type: {profile.query_type}")
|
|
90
|
+
lines.append(f"Total Duration: {profile.duration_ms:.2f}ms")
|
|
91
|
+
lines.append("")
|
|
92
|
+
|
|
93
|
+
if show_steps and profile.steps:
|
|
94
|
+
lines.append("Execution Steps:")
|
|
95
|
+
lines.append("-" * 60)
|
|
96
|
+
|
|
97
|
+
for i, step in enumerate(profile.steps, 1):
|
|
98
|
+
duration = step["duration_ms"]
|
|
99
|
+
percentage = (duration / profile.duration_ms * 100) if profile.duration_ms else 0
|
|
100
|
+
|
|
101
|
+
lines.append(f"{i}. {step['name']}")
|
|
102
|
+
lines.append(f" Duration: {duration:.2f}ms ({percentage:.1f}%)")
|
|
103
|
+
|
|
104
|
+
# Show bar chart
|
|
105
|
+
bar_length = int(percentage / 2) # Scale to 50 chars max
|
|
106
|
+
bar = "█" * bar_length
|
|
107
|
+
lines.append(f" [{bar:<50}]")
|
|
108
|
+
|
|
109
|
+
if step.get("metadata"):
|
|
110
|
+
lines.append(f" Metadata: {step['metadata']}")
|
|
111
|
+
|
|
112
|
+
lines.append("")
|
|
113
|
+
|
|
114
|
+
if profile.metadata:
|
|
115
|
+
lines.append("Query Metadata:")
|
|
116
|
+
for key, value in profile.metadata.items():
|
|
117
|
+
lines.append(f" {key}: {value}")
|
|
118
|
+
lines.append("")
|
|
119
|
+
|
|
120
|
+
lines.append("=" * 60)
|
|
121
|
+
return "\n".join(lines)
|
|
122
|
+
|
|
123
|
+
def visualize_comparison(self, profiles: List[QueryProfile]) -> str:
|
|
124
|
+
"""
|
|
125
|
+
Visualize comparison of multiple query profiles
|
|
126
|
+
|
|
127
|
+
Args:
|
|
128
|
+
profiles: List of profiles to compare
|
|
129
|
+
|
|
130
|
+
Returns:
|
|
131
|
+
Text visualization comparing profiles
|
|
132
|
+
"""
|
|
133
|
+
if not profiles:
|
|
134
|
+
return "No profiles to compare"
|
|
135
|
+
|
|
136
|
+
lines = []
|
|
137
|
+
lines.append("=" * 60)
|
|
138
|
+
lines.append("QUERY PROFILE COMPARISON")
|
|
139
|
+
lines.append("=" * 60)
|
|
140
|
+
|
|
141
|
+
# Summary table
|
|
142
|
+
lines.append(f"{'Query ID':<20} {'Type':<15} {'Duration (ms)':<15}")
|
|
143
|
+
lines.append("-" * 60)
|
|
144
|
+
|
|
145
|
+
for profile in profiles:
|
|
146
|
+
duration = f"{profile.duration_ms:.2f}" if profile.duration_ms else "N/A"
|
|
147
|
+
lines.append(f"{profile.query_id:<20} {profile.query_type:<15} {duration:<15}")
|
|
148
|
+
|
|
149
|
+
lines.append("")
|
|
150
|
+
|
|
151
|
+
# Statistics
|
|
152
|
+
durations = [p.duration_ms for p in profiles if p.duration_ms]
|
|
153
|
+
if durations:
|
|
154
|
+
lines.append("Statistics:")
|
|
155
|
+
lines.append(f" Average: {sum(durations) / len(durations):.2f}ms")
|
|
156
|
+
lines.append(f" Min: {min(durations):.2f}ms")
|
|
157
|
+
lines.append(f" Max: {max(durations):.2f}ms")
|
|
158
|
+
|
|
159
|
+
lines.append("=" * 60)
|
|
160
|
+
return "\n".join(lines)
|
|
161
|
+
|
|
162
|
+
def export_to_json(self, profile: QueryProfile) -> Dict[str, Any]:
|
|
163
|
+
"""
|
|
164
|
+
Export profile to JSON format
|
|
165
|
+
|
|
166
|
+
Args:
|
|
167
|
+
profile: Query profile to export
|
|
168
|
+
|
|
169
|
+
Returns:
|
|
170
|
+
Dictionary representation suitable for JSON export
|
|
171
|
+
"""
|
|
172
|
+
return profile.to_dict()
|
|
173
|
+
|
|
174
|
+
def generate_flamegraph_data(self, profile: QueryProfile) -> List[Dict[str, Any]]:
|
|
175
|
+
"""
|
|
176
|
+
Generate data for flamegraph visualization
|
|
177
|
+
|
|
178
|
+
Args:
|
|
179
|
+
profile: Query profile
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
List of flamegraph data points
|
|
183
|
+
"""
|
|
184
|
+
data = []
|
|
185
|
+
|
|
186
|
+
for step in profile.steps:
|
|
187
|
+
data.append(
|
|
188
|
+
{
|
|
189
|
+
"name": step["name"],
|
|
190
|
+
"value": step["duration_ms"],
|
|
191
|
+
"percentage": ((step["duration_ms"] / profile.duration_ms * 100) if profile.duration_ms else 0),
|
|
192
|
+
}
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
return data
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Query Profiler for Knowledge Graph
|
|
3
|
+
|
|
4
|
+
Provides detailed profiling and timing metrics for graph queries.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import time
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Dict, Any, List, Optional
|
|
10
|
+
from dataclasses import dataclass, field
|
|
11
|
+
from contextlib import asynccontextmanager
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dataclass
|
|
18
|
+
class QueryProfile:
|
|
19
|
+
"""
|
|
20
|
+
Profile data for a single query execution
|
|
21
|
+
|
|
22
|
+
Attributes:
|
|
23
|
+
query_id: Unique identifier for the query
|
|
24
|
+
query_type: Type of query (search, traverse, etc.)
|
|
25
|
+
start_time: When the query started
|
|
26
|
+
end_time: When the query completed
|
|
27
|
+
duration_ms: Total duration in milliseconds
|
|
28
|
+
steps: List of execution steps with timing
|
|
29
|
+
metadata: Additional query metadata
|
|
30
|
+
"""
|
|
31
|
+
|
|
32
|
+
query_id: str
|
|
33
|
+
query_type: str
|
|
34
|
+
start_time: datetime
|
|
35
|
+
end_time: Optional[datetime] = None
|
|
36
|
+
duration_ms: Optional[float] = None
|
|
37
|
+
steps: List[Dict[str, Any]] = field(default_factory=list)
|
|
38
|
+
metadata: Dict[str, Any] = field(default_factory=dict)
|
|
39
|
+
|
|
40
|
+
def complete(self) -> None:
|
|
41
|
+
"""Mark query as complete and calculate duration"""
|
|
42
|
+
self.end_time = datetime.utcnow()
|
|
43
|
+
if self.start_time:
|
|
44
|
+
delta = self.end_time - self.start_time
|
|
45
|
+
self.duration_ms = delta.total_seconds() * 1000
|
|
46
|
+
|
|
47
|
+
def add_step(
|
|
48
|
+
self,
|
|
49
|
+
name: str,
|
|
50
|
+
duration_ms: float,
|
|
51
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
52
|
+
) -> None:
|
|
53
|
+
"""Add an execution step"""
|
|
54
|
+
self.steps.append(
|
|
55
|
+
{
|
|
56
|
+
"name": name,
|
|
57
|
+
"duration_ms": duration_ms,
|
|
58
|
+
"metadata": metadata or {},
|
|
59
|
+
}
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
63
|
+
"""Convert to dictionary"""
|
|
64
|
+
return {
|
|
65
|
+
"query_id": self.query_id,
|
|
66
|
+
"query_type": self.query_type,
|
|
67
|
+
"start_time": self.start_time.isoformat(),
|
|
68
|
+
"end_time": self.end_time.isoformat() if self.end_time else None,
|
|
69
|
+
"duration_ms": self.duration_ms,
|
|
70
|
+
"steps": self.steps,
|
|
71
|
+
"metadata": self.metadata,
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
class QueryProfiler:
|
|
76
|
+
"""
|
|
77
|
+
Query profiler for detailed performance analysis
|
|
78
|
+
|
|
79
|
+
Tracks query execution with step-by-step timing and metadata.
|
|
80
|
+
|
|
81
|
+
Example:
|
|
82
|
+
```python
|
|
83
|
+
profiler = QueryProfiler()
|
|
84
|
+
|
|
85
|
+
# Profile a query
|
|
86
|
+
async with profiler.profile("search_query", "vector_search") as profile:
|
|
87
|
+
# Step 1
|
|
88
|
+
async with profiler.step(profile, "embedding_lookup"):
|
|
89
|
+
embedding = await get_embedding(query)
|
|
90
|
+
|
|
91
|
+
# Step 2
|
|
92
|
+
async with profiler.step(profile, "vector_search"):
|
|
93
|
+
results = await search(embedding)
|
|
94
|
+
|
|
95
|
+
# Get profile
|
|
96
|
+
profile_data = profiler.get_profile("search_query")
|
|
97
|
+
print(f"Total: {profile_data.duration_ms}ms")
|
|
98
|
+
for step in profile_data.steps:
|
|
99
|
+
print(f" {step['name']}: {step['duration_ms']}ms")
|
|
100
|
+
```
|
|
101
|
+
"""
|
|
102
|
+
|
|
103
|
+
def __init__(self, max_profiles: int = 1000):
|
|
104
|
+
"""
|
|
105
|
+
Initialize query profiler
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
max_profiles: Maximum number of profiles to keep in memory
|
|
109
|
+
"""
|
|
110
|
+
self.max_profiles = max_profiles
|
|
111
|
+
self.profiles: Dict[str, QueryProfile] = {}
|
|
112
|
+
self._profile_order: List[str] = []
|
|
113
|
+
|
|
114
|
+
@asynccontextmanager
|
|
115
|
+
async def profile(
|
|
116
|
+
self,
|
|
117
|
+
query_id: str,
|
|
118
|
+
query_type: str,
|
|
119
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
120
|
+
):
|
|
121
|
+
"""
|
|
122
|
+
Context manager for profiling a query
|
|
123
|
+
|
|
124
|
+
Args:
|
|
125
|
+
query_id: Unique identifier for the query
|
|
126
|
+
query_type: Type of query
|
|
127
|
+
metadata: Additional metadata
|
|
128
|
+
|
|
129
|
+
Yields:
|
|
130
|
+
QueryProfile object
|
|
131
|
+
"""
|
|
132
|
+
# Create profile
|
|
133
|
+
profile = QueryProfile(
|
|
134
|
+
query_id=query_id,
|
|
135
|
+
query_type=query_type,
|
|
136
|
+
start_time=datetime.utcnow(),
|
|
137
|
+
metadata=metadata or {},
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
try:
|
|
141
|
+
yield profile
|
|
142
|
+
finally:
|
|
143
|
+
# Complete profile
|
|
144
|
+
profile.complete()
|
|
145
|
+
|
|
146
|
+
# Store profile
|
|
147
|
+
self._store_profile(profile)
|
|
148
|
+
|
|
149
|
+
@asynccontextmanager
|
|
150
|
+
async def step(
|
|
151
|
+
self,
|
|
152
|
+
profile: QueryProfile,
|
|
153
|
+
step_name: str,
|
|
154
|
+
metadata: Optional[Dict[str, Any]] = None,
|
|
155
|
+
):
|
|
156
|
+
"""
|
|
157
|
+
Context manager for profiling a query step
|
|
158
|
+
|
|
159
|
+
Args:
|
|
160
|
+
profile: Parent query profile
|
|
161
|
+
step_name: Name of the step
|
|
162
|
+
metadata: Additional metadata
|
|
163
|
+
"""
|
|
164
|
+
start_time = time.perf_counter()
|
|
165
|
+
|
|
166
|
+
try:
|
|
167
|
+
yield
|
|
168
|
+
finally:
|
|
169
|
+
end_time = time.perf_counter()
|
|
170
|
+
duration_ms = (end_time - start_time) * 1000
|
|
171
|
+
profile.add_step(step_name, duration_ms, metadata)
|
|
172
|
+
|
|
173
|
+
def _store_profile(self, profile: QueryProfile) -> None:
|
|
174
|
+
"""Store profile with LRU eviction"""
|
|
175
|
+
# Add to storage
|
|
176
|
+
self.profiles[profile.query_id] = profile
|
|
177
|
+
self._profile_order.append(profile.query_id)
|
|
178
|
+
|
|
179
|
+
# Evict oldest if over limit
|
|
180
|
+
while len(self._profile_order) > self.max_profiles:
|
|
181
|
+
oldest_id = self._profile_order.pop(0)
|
|
182
|
+
if oldest_id in self.profiles:
|
|
183
|
+
del self.profiles[oldest_id]
|
|
184
|
+
|
|
185
|
+
def get_profile(self, query_id: str) -> Optional[QueryProfile]:
|
|
186
|
+
"""Get profile by query ID"""
|
|
187
|
+
return self.profiles.get(query_id)
|
|
188
|
+
|
|
189
|
+
def get_all_profiles(self) -> List[QueryProfile]:
|
|
190
|
+
"""Get all stored profiles"""
|
|
191
|
+
return list(self.profiles.values())
|
|
192
|
+
|
|
193
|
+
def get_stats(self) -> Dict[str, Any]:
|
|
194
|
+
"""Get profiling statistics"""
|
|
195
|
+
if not self.profiles:
|
|
196
|
+
return {
|
|
197
|
+
"total_queries": 0,
|
|
198
|
+
"avg_duration_ms": 0,
|
|
199
|
+
"min_duration_ms": 0,
|
|
200
|
+
"max_duration_ms": 0,
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
durations = [p.duration_ms for p in self.profiles.values() if p.duration_ms]
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
"total_queries": len(self.profiles),
|
|
207
|
+
"avg_duration_ms": (sum(durations) / len(durations) if durations else 0),
|
|
208
|
+
"min_duration_ms": min(durations) if durations else 0,
|
|
209
|
+
"max_duration_ms": max(durations) if durations else 0,
|
|
210
|
+
"query_types": self._get_query_type_stats(),
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
def _get_query_type_stats(self) -> Dict[str, int]:
|
|
214
|
+
"""Get statistics by query type"""
|
|
215
|
+
stats: Dict[str, int] = {}
|
|
216
|
+
for profile in self.profiles.values():
|
|
217
|
+
stats[profile.query_type] = stats.get(profile.query_type, 0) + 1
|
|
218
|
+
return stats
|
|
219
|
+
|
|
220
|
+
def clear(self) -> None:
|
|
221
|
+
"""Clear all profiles"""
|
|
222
|
+
self.profiles.clear()
|
|
223
|
+
self._profile_order.clear()
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph Reasoning Module
|
|
3
|
+
|
|
4
|
+
Provides query planning, multi-hop reasoning, and inference capabilities.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aiecs.application.knowledge_graph.reasoning.query_planner import (
|
|
8
|
+
QueryPlanner,
|
|
9
|
+
)
|
|
10
|
+
from aiecs.application.knowledge_graph.reasoning.reasoning_engine import (
|
|
11
|
+
ReasoningEngine,
|
|
12
|
+
)
|
|
13
|
+
from aiecs.application.knowledge_graph.reasoning.inference_engine import (
|
|
14
|
+
InferenceEngine,
|
|
15
|
+
InferenceCache,
|
|
16
|
+
)
|
|
17
|
+
from aiecs.application.knowledge_graph.reasoning.evidence_synthesis import (
|
|
18
|
+
EvidenceSynthesizer,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
__all__ = [
|
|
22
|
+
"QueryPlanner",
|
|
23
|
+
"ReasoningEngine",
|
|
24
|
+
"InferenceEngine",
|
|
25
|
+
"InferenceCache",
|
|
26
|
+
"EvidenceSynthesizer",
|
|
27
|
+
]
|