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,212 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Global Metrics Manager
|
|
3
|
+
|
|
4
|
+
This module provides a singleton ExecutorMetrics instance that can be shared
|
|
5
|
+
across all components in the application. It follows the same pattern as
|
|
6
|
+
other global managers in the infrastructure layer.
|
|
7
|
+
|
|
8
|
+
Usage:
|
|
9
|
+
# In main.py startup:
|
|
10
|
+
await initialize_global_metrics()
|
|
11
|
+
|
|
12
|
+
# In any component:
|
|
13
|
+
from aiecs.infrastructure.monitoring.global_metrics_manager import get_global_metrics
|
|
14
|
+
metrics = get_global_metrics()
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import logging
|
|
18
|
+
import asyncio
|
|
19
|
+
import os
|
|
20
|
+
from typing import Optional, Dict, Any
|
|
21
|
+
from .executor_metrics import ExecutorMetrics
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
# Global singleton instance
|
|
26
|
+
_global_metrics: Optional[ExecutorMetrics] = None
|
|
27
|
+
_initialization_lock = asyncio.Lock()
|
|
28
|
+
_initialized = False
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
async def initialize_global_metrics(
|
|
32
|
+
enable_metrics: bool = True,
|
|
33
|
+
metrics_port: Optional[int] = None,
|
|
34
|
+
config: Optional[Dict[str, Any]] = None,
|
|
35
|
+
) -> Optional[ExecutorMetrics]:
|
|
36
|
+
"""
|
|
37
|
+
Initialize the global ExecutorMetrics instance.
|
|
38
|
+
|
|
39
|
+
This should be called once during application startup (in main.py lifespan).
|
|
40
|
+
|
|
41
|
+
Args:
|
|
42
|
+
enable_metrics: Whether to enable metrics collection (default: True)
|
|
43
|
+
metrics_port: Port for metrics server (default: from env or 8001)
|
|
44
|
+
config: Additional configuration options
|
|
45
|
+
|
|
46
|
+
Returns:
|
|
47
|
+
The initialized ExecutorMetrics instance or None if initialization fails
|
|
48
|
+
|
|
49
|
+
Example:
|
|
50
|
+
@asynccontextmanager
|
|
51
|
+
async def lifespan(app: FastAPI):
|
|
52
|
+
# Startup
|
|
53
|
+
await initialize_global_metrics()
|
|
54
|
+
yield
|
|
55
|
+
# Shutdown
|
|
56
|
+
await close_global_metrics()
|
|
57
|
+
"""
|
|
58
|
+
global _global_metrics, _initialized
|
|
59
|
+
|
|
60
|
+
if _initialized and _global_metrics:
|
|
61
|
+
logger.info("Global metrics already initialized")
|
|
62
|
+
return _global_metrics
|
|
63
|
+
|
|
64
|
+
async with _initialization_lock:
|
|
65
|
+
# Double-check after acquiring lock
|
|
66
|
+
if _initialized and _global_metrics:
|
|
67
|
+
return _global_metrics
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
# Determine metrics port
|
|
71
|
+
if metrics_port is None:
|
|
72
|
+
metrics_port = int(os.environ.get("METRICS_PORT", "8001"))
|
|
73
|
+
|
|
74
|
+
# Check if metrics should be enabled
|
|
75
|
+
if not enable_metrics:
|
|
76
|
+
enable_metrics = os.environ.get("ENABLE_METRICS", "true").lower() == "true"
|
|
77
|
+
|
|
78
|
+
logger.info(f"Initializing global metrics (port: {metrics_port}, enabled: {enable_metrics})...")
|
|
79
|
+
|
|
80
|
+
# Create metrics instance
|
|
81
|
+
_global_metrics = ExecutorMetrics(enable_metrics=enable_metrics, metrics_port=metrics_port)
|
|
82
|
+
|
|
83
|
+
_initialized = True
|
|
84
|
+
logger.info("✅ Global metrics initialized successfully")
|
|
85
|
+
return _global_metrics
|
|
86
|
+
|
|
87
|
+
except Exception as e:
|
|
88
|
+
logger.error(f"❌ Failed to initialize global metrics: {e}")
|
|
89
|
+
logger.warning("Application will continue without metrics (degraded mode)")
|
|
90
|
+
_global_metrics = None
|
|
91
|
+
_initialized = False
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def get_global_metrics() -> Optional[ExecutorMetrics]:
|
|
96
|
+
"""
|
|
97
|
+
Get the global ExecutorMetrics instance.
|
|
98
|
+
|
|
99
|
+
Returns:
|
|
100
|
+
The global ExecutorMetrics instance or None if not initialized
|
|
101
|
+
|
|
102
|
+
Raises:
|
|
103
|
+
RuntimeError: If metrics are requested but not initialized
|
|
104
|
+
|
|
105
|
+
Example:
|
|
106
|
+
metrics = get_global_metrics()
|
|
107
|
+
if metrics:
|
|
108
|
+
metrics.record_operation('my_operation', 1)
|
|
109
|
+
"""
|
|
110
|
+
if _global_metrics is None:
|
|
111
|
+
logger.warning("Global metrics not initialized - call initialize_global_metrics() first")
|
|
112
|
+
return None
|
|
113
|
+
|
|
114
|
+
return _global_metrics
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
async def close_global_metrics():
|
|
118
|
+
"""
|
|
119
|
+
Close the global metrics instance.
|
|
120
|
+
|
|
121
|
+
This should be called during application shutdown.
|
|
122
|
+
"""
|
|
123
|
+
global _global_metrics, _initialized
|
|
124
|
+
|
|
125
|
+
if _global_metrics:
|
|
126
|
+
try:
|
|
127
|
+
# ExecutorMetrics doesn't have a close method, but we can clean up
|
|
128
|
+
logger.info("Closing global metrics...")
|
|
129
|
+
_global_metrics = None
|
|
130
|
+
_initialized = False
|
|
131
|
+
logger.info("✅ Global metrics closed successfully")
|
|
132
|
+
except Exception as e:
|
|
133
|
+
logger.error(f"❌ Error closing global metrics: {e}")
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def is_metrics_initialized() -> bool:
|
|
137
|
+
"""
|
|
138
|
+
Check if global metrics are initialized.
|
|
139
|
+
|
|
140
|
+
Returns:
|
|
141
|
+
True if metrics are initialized, False otherwise
|
|
142
|
+
"""
|
|
143
|
+
return _initialized and _global_metrics is not None
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def get_metrics_summary() -> Dict[str, Any]:
|
|
147
|
+
"""
|
|
148
|
+
Get a summary of the global metrics status.
|
|
149
|
+
|
|
150
|
+
Returns:
|
|
151
|
+
Dictionary containing metrics status information
|
|
152
|
+
"""
|
|
153
|
+
if not is_metrics_initialized():
|
|
154
|
+
return {
|
|
155
|
+
"initialized": False,
|
|
156
|
+
"message": "Global metrics not initialized",
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if _global_metrics is None:
|
|
160
|
+
return {
|
|
161
|
+
"initialized": False,
|
|
162
|
+
"message": "Global metrics not initialized",
|
|
163
|
+
}
|
|
164
|
+
try:
|
|
165
|
+
return _global_metrics.get_metrics_summary()
|
|
166
|
+
except Exception as e:
|
|
167
|
+
return {
|
|
168
|
+
"initialized": True,
|
|
169
|
+
"error": str(e),
|
|
170
|
+
"message": "Failed to get metrics summary",
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
# Convenience functions for common operations
|
|
175
|
+
def record_operation(
|
|
176
|
+
operation_type: str,
|
|
177
|
+
success: bool = True,
|
|
178
|
+
duration: Optional[float] = None,
|
|
179
|
+
**kwargs,
|
|
180
|
+
):
|
|
181
|
+
"""Record an operation using global metrics."""
|
|
182
|
+
metrics = get_global_metrics()
|
|
183
|
+
if metrics:
|
|
184
|
+
metrics.record_operation(operation_type, success, duration, **kwargs)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def record_duration(operation: str, duration: float, labels: Optional[Dict[str, str]] = None):
|
|
188
|
+
"""Record operation duration using global metrics."""
|
|
189
|
+
metrics = get_global_metrics()
|
|
190
|
+
if metrics:
|
|
191
|
+
metrics.record_duration(operation, duration, labels)
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
def record_operation_success(operation: str, labels: Optional[Dict[str, str]] = None):
|
|
195
|
+
"""Record operation success using global metrics."""
|
|
196
|
+
metrics = get_global_metrics()
|
|
197
|
+
if metrics:
|
|
198
|
+
metrics.record_operation_success(operation, labels)
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
def record_operation_failure(operation: str, error_type: str, labels: Optional[Dict[str, str]] = None):
|
|
202
|
+
"""Record operation failure using global metrics."""
|
|
203
|
+
metrics = get_global_metrics()
|
|
204
|
+
if metrics:
|
|
205
|
+
metrics.record_operation_failure(operation, error_type, labels)
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
def record_retry(operation: str, attempt_number: int):
|
|
209
|
+
"""Record retry using global metrics."""
|
|
210
|
+
metrics = get_global_metrics()
|
|
211
|
+
if metrics:
|
|
212
|
+
metrics.record_retry(operation, attempt_number)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"""Structured logging setup for aiecs."""
|
|
2
|
+
|
|
2
3
|
import logging
|
|
3
4
|
import sys
|
|
4
|
-
from typing import Optional
|
|
5
5
|
|
|
6
6
|
|
|
7
7
|
def setup_structured_logging(level: str = "INFO", format_type: str = "json") -> None:
|
|
@@ -18,14 +18,10 @@ def setup_structured_logging(level: str = "INFO", format_type: str = "json") ->
|
|
|
18
18
|
# Create formatter
|
|
19
19
|
if format_type.lower() == "json":
|
|
20
20
|
# Simple JSON-like format for now
|
|
21
|
-
formatter = logging.Formatter(
|
|
22
|
-
'{"timestamp": "%(asctime)s", "level": "%(levelname)s", "module": "%(name)s", "message": "%(message)s"}'
|
|
23
|
-
)
|
|
21
|
+
formatter = logging.Formatter('{"timestamp": "%(asctime)s", "level": "%(levelname)s", "module": "%(name)s", "message": "%(message)s"}')
|
|
24
22
|
else:
|
|
25
23
|
# Standard text format
|
|
26
|
-
formatter = logging.Formatter(
|
|
27
|
-
'%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
28
|
-
)
|
|
24
|
+
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
|
|
29
25
|
|
|
30
26
|
# Setup root logger
|
|
31
27
|
root_logger = logging.getLogger()
|
|
@@ -4,7 +4,7 @@ import os
|
|
|
4
4
|
from typing import Dict, Any, Optional
|
|
5
5
|
import jaeger_client
|
|
6
6
|
import jaeger_client.config
|
|
7
|
-
from opentracing import
|
|
7
|
+
from opentracing import Span
|
|
8
8
|
|
|
9
9
|
logger = logging.getLogger(__name__)
|
|
10
10
|
|
|
@@ -14,12 +14,16 @@ class TracingManager:
|
|
|
14
14
|
Specialized handler for distributed tracing and link tracking
|
|
15
15
|
"""
|
|
16
16
|
|
|
17
|
-
def __init__(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
service_name: str = "service_executor",
|
|
20
|
+
jaeger_host: Optional[str] = None,
|
|
21
|
+
jaeger_port: Optional[int] = None,
|
|
22
|
+
enable_tracing: Optional[bool] = None,
|
|
23
|
+
):
|
|
21
24
|
self.service_name = service_name
|
|
22
|
-
# Get configuration from environment variables, use defaults if not
|
|
25
|
+
# Get configuration from environment variables, use defaults if not
|
|
26
|
+
# available
|
|
23
27
|
self.jaeger_host = jaeger_host or os.getenv("JAEGER_AGENT_HOST", "jaeger")
|
|
24
28
|
self.jaeger_port = jaeger_port or int(os.getenv("JAEGER_AGENT_PORT", "6831"))
|
|
25
29
|
self.enable_tracing = enable_tracing if enable_tracing is not None else os.getenv("JAEGER_ENABLE_TRACING", "true").lower() == "true"
|
|
@@ -33,18 +37,18 @@ class TracingManager:
|
|
|
33
37
|
try:
|
|
34
38
|
config = jaeger_client.config.Config(
|
|
35
39
|
config={
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
"sampler": {
|
|
41
|
+
"type": "const",
|
|
42
|
+
"param": 1,
|
|
39
43
|
},
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
44
|
+
"local_agent": {
|
|
45
|
+
"reporting_host": self.jaeger_host,
|
|
46
|
+
"reporting_port": self.jaeger_port,
|
|
43
47
|
},
|
|
44
|
-
|
|
48
|
+
"logging": True,
|
|
45
49
|
},
|
|
46
50
|
service_name=self.service_name,
|
|
47
|
-
validate=True
|
|
51
|
+
validate=True,
|
|
48
52
|
)
|
|
49
53
|
self.tracer = config.initialize_tracer()
|
|
50
54
|
logger.info(f"Jaeger tracer initialized for service '{self.service_name}' at {self.jaeger_host}:{self.jaeger_port}")
|
|
@@ -53,8 +57,12 @@ class TracingManager:
|
|
|
53
57
|
self.tracer = None
|
|
54
58
|
self.enable_tracing = False
|
|
55
59
|
|
|
56
|
-
def start_span(
|
|
57
|
-
|
|
60
|
+
def start_span(
|
|
61
|
+
self,
|
|
62
|
+
operation_name: str,
|
|
63
|
+
parent_span: Optional[Span] = None,
|
|
64
|
+
tags: Optional[Dict[str, Any]] = None,
|
|
65
|
+
) -> Optional[Span]:
|
|
58
66
|
"""
|
|
59
67
|
Start a tracing span
|
|
60
68
|
|
|
@@ -70,10 +78,7 @@ class TracingManager:
|
|
|
70
78
|
return None
|
|
71
79
|
|
|
72
80
|
try:
|
|
73
|
-
span = self.tracer.start_span(
|
|
74
|
-
operation_name=operation_name,
|
|
75
|
-
child_of=parent_span
|
|
76
|
-
)
|
|
81
|
+
span = self.tracer.start_span(operation_name=operation_name, child_of=parent_span)
|
|
77
82
|
|
|
78
83
|
# Set initial tags
|
|
79
84
|
if tags:
|
|
@@ -89,8 +94,13 @@ class TracingManager:
|
|
|
89
94
|
logger.error(f"Error starting span '{operation_name}': {e}")
|
|
90
95
|
return None
|
|
91
96
|
|
|
92
|
-
def finish_span(
|
|
93
|
-
|
|
97
|
+
def finish_span(
|
|
98
|
+
self,
|
|
99
|
+
span: Optional[Span],
|
|
100
|
+
tags: Optional[Dict[str, Any]] = None,
|
|
101
|
+
logs: Optional[Dict[str, Any]] = None,
|
|
102
|
+
error: Optional[Exception] = None,
|
|
103
|
+
):
|
|
94
104
|
"""
|
|
95
105
|
Finish tracing span
|
|
96
106
|
|
|
@@ -132,6 +142,7 @@ class TracingManager:
|
|
|
132
142
|
operation_name: Operation name
|
|
133
143
|
tags: Initial tags
|
|
134
144
|
"""
|
|
145
|
+
|
|
135
146
|
def decorator(func):
|
|
136
147
|
@functools.wraps(func)
|
|
137
148
|
async def async_wrapper(*args, **kwargs):
|
|
@@ -185,6 +196,7 @@ class TracingManager:
|
|
|
185
196
|
|
|
186
197
|
# Return appropriate wrapper based on function type
|
|
187
198
|
import asyncio
|
|
199
|
+
|
|
188
200
|
if asyncio.iscoroutinefunction(func):
|
|
189
201
|
return async_wrapper
|
|
190
202
|
else:
|
|
@@ -202,29 +214,31 @@ class TracingManager:
|
|
|
202
214
|
for i, arg in enumerate(args):
|
|
203
215
|
if isinstance(arg, (str, int, float, bool)):
|
|
204
216
|
span.set_tag(f"arg_{i}", arg)
|
|
205
|
-
elif hasattr(arg,
|
|
217
|
+
elif hasattr(arg, "__class__"):
|
|
206
218
|
span.set_tag(f"arg_{i}_type", arg.__class__.__name__)
|
|
207
219
|
|
|
208
220
|
# Add keyword arguments
|
|
209
221
|
for key, value in kwargs.items():
|
|
210
222
|
if isinstance(value, (str, int, float, bool)):
|
|
211
223
|
span.set_tag(key, value)
|
|
212
|
-
|
|
224
|
+
# Avoid overly large dictionaries
|
|
225
|
+
elif isinstance(value, dict) and len(str(value)) < 1000:
|
|
213
226
|
span.set_tag(f"{key}_json", str(value))
|
|
214
|
-
elif hasattr(value,
|
|
227
|
+
elif hasattr(value, "__class__"):
|
|
215
228
|
span.set_tag(f"{key}_type", value.__class__.__name__)
|
|
216
229
|
except Exception as e:
|
|
217
230
|
logger.debug(f"Error adding function args to span: {e}")
|
|
218
231
|
|
|
219
|
-
def trace_database_operation(self, operation: str, table: str = None, query: str = None):
|
|
232
|
+
def trace_database_operation(self, operation: str, table: Optional[str] = None, query: Optional[str] = None):
|
|
220
233
|
"""Database operation tracing decorator"""
|
|
234
|
+
|
|
221
235
|
def decorator(func):
|
|
222
236
|
@functools.wraps(func)
|
|
223
237
|
async def wrapper(*args, **kwargs):
|
|
224
238
|
tags = {
|
|
225
239
|
"component": "database",
|
|
226
240
|
"db.type": "postgresql",
|
|
227
|
-
"db.statement.type": operation
|
|
241
|
+
"db.statement.type": operation,
|
|
228
242
|
}
|
|
229
243
|
|
|
230
244
|
if table:
|
|
@@ -237,7 +251,10 @@ class TracingManager:
|
|
|
237
251
|
try:
|
|
238
252
|
result = await func(*args, **kwargs)
|
|
239
253
|
if span:
|
|
240
|
-
span.set_tag(
|
|
254
|
+
span.set_tag(
|
|
255
|
+
"db.rows_affected",
|
|
256
|
+
len(result) if isinstance(result, list) else 1,
|
|
257
|
+
)
|
|
241
258
|
return result
|
|
242
259
|
except Exception as e:
|
|
243
260
|
self.finish_span(span, error=e)
|
|
@@ -247,17 +264,19 @@ class TracingManager:
|
|
|
247
264
|
self.finish_span(span)
|
|
248
265
|
|
|
249
266
|
return wrapper
|
|
267
|
+
|
|
250
268
|
return decorator
|
|
251
269
|
|
|
252
|
-
def trace_external_call(self, service_name: str, endpoint: str = None):
|
|
270
|
+
def trace_external_call(self, service_name: str, endpoint: Optional[str] = None):
|
|
253
271
|
"""External service call tracing decorator"""
|
|
272
|
+
|
|
254
273
|
def decorator(func):
|
|
255
274
|
@functools.wraps(func)
|
|
256
275
|
async def wrapper(*args, **kwargs):
|
|
257
276
|
tags = {
|
|
258
277
|
"component": "http",
|
|
259
278
|
"span.kind": "client",
|
|
260
|
-
"peer.service": service_name
|
|
279
|
+
"peer.service": service_name,
|
|
261
280
|
}
|
|
262
281
|
|
|
263
282
|
if endpoint:
|
|
@@ -280,17 +299,19 @@ class TracingManager:
|
|
|
280
299
|
self.finish_span(span)
|
|
281
300
|
|
|
282
301
|
return wrapper
|
|
302
|
+
|
|
283
303
|
return decorator
|
|
284
304
|
|
|
285
305
|
def trace_tool_execution(self, tool_name: str, operation: str):
|
|
286
306
|
"""Tool execution tracing decorator"""
|
|
307
|
+
|
|
287
308
|
def decorator(func):
|
|
288
309
|
@functools.wraps(func)
|
|
289
310
|
async def wrapper(*args, **kwargs):
|
|
290
311
|
tags = {
|
|
291
312
|
"component": "tool",
|
|
292
313
|
"tool.name": tool_name,
|
|
293
|
-
"tool.operation": operation
|
|
314
|
+
"tool.operation": operation,
|
|
294
315
|
}
|
|
295
316
|
|
|
296
317
|
span = self.start_span(f"tool.{tool_name}.{operation}", tags=tags)
|
|
@@ -299,7 +320,7 @@ class TracingManager:
|
|
|
299
320
|
result = await func(*args, **kwargs)
|
|
300
321
|
if span:
|
|
301
322
|
span.set_tag("tool.success", True)
|
|
302
|
-
if hasattr(result,
|
|
323
|
+
if hasattr(result, "__len__"):
|
|
303
324
|
span.set_tag("tool.result_size", len(result))
|
|
304
325
|
return result
|
|
305
326
|
except Exception as e:
|
|
@@ -312,10 +333,15 @@ class TracingManager:
|
|
|
312
333
|
self.finish_span(span)
|
|
313
334
|
|
|
314
335
|
return wrapper
|
|
336
|
+
|
|
315
337
|
return decorator
|
|
316
338
|
|
|
317
|
-
def create_child_span(
|
|
318
|
-
|
|
339
|
+
def create_child_span(
|
|
340
|
+
self,
|
|
341
|
+
parent_span: Optional[Span],
|
|
342
|
+
operation_name: str,
|
|
343
|
+
tags: Optional[Dict[str, Any]] = None,
|
|
344
|
+
) -> Optional[Span]:
|
|
319
345
|
"""Create child span"""
|
|
320
346
|
if not self.enable_tracing or not parent_span:
|
|
321
347
|
return None
|
|
@@ -329,6 +355,7 @@ class TracingManager:
|
|
|
329
355
|
|
|
330
356
|
try:
|
|
331
357
|
from opentracing.propagation import Format
|
|
358
|
+
|
|
332
359
|
self.tracer.inject(span.context, Format.TEXT_MAP, carrier)
|
|
333
360
|
except Exception as e:
|
|
334
361
|
logger.error(f"Error injecting span context: {e}")
|
|
@@ -340,6 +367,7 @@ class TracingManager:
|
|
|
340
367
|
|
|
341
368
|
try:
|
|
342
369
|
from opentracing.propagation import Format
|
|
370
|
+
|
|
343
371
|
return self.tracer.extract(Format.TEXT_MAP, carrier)
|
|
344
372
|
except Exception as e:
|
|
345
373
|
logger.error(f"Error extracting span context: {e}")
|
|
@@ -372,5 +400,5 @@ class TracingManager:
|
|
|
372
400
|
"service_name": self.service_name,
|
|
373
401
|
"jaeger_host": self.jaeger_host,
|
|
374
402
|
"jaeger_port": self.jaeger_port,
|
|
375
|
-
"tracer_initialized": self.tracer is not None
|
|
403
|
+
"tracer_initialized": self.tracer is not None,
|
|
376
404
|
}
|
|
@@ -4,9 +4,22 @@ Contains data persistence and storage infrastructure.
|
|
|
4
4
|
"""
|
|
5
5
|
|
|
6
6
|
from .database_manager import DatabaseManager
|
|
7
|
-
from .redis_client import RedisClient
|
|
7
|
+
from .redis_client import RedisClient, get_redis_client
|
|
8
|
+
from .context_engine_client import (
|
|
9
|
+
initialize_context_engine,
|
|
10
|
+
get_context_engine,
|
|
11
|
+
close_context_engine,
|
|
12
|
+
is_context_engine_initialized,
|
|
13
|
+
reset_context_engine,
|
|
14
|
+
)
|
|
8
15
|
|
|
9
16
|
__all__ = [
|
|
10
17
|
"DatabaseManager",
|
|
11
18
|
"RedisClient",
|
|
19
|
+
"get_redis_client",
|
|
20
|
+
"initialize_context_engine",
|
|
21
|
+
"get_context_engine",
|
|
22
|
+
"close_context_engine",
|
|
23
|
+
"is_context_engine_initialized",
|
|
24
|
+
"reset_context_engine",
|
|
12
25
|
]
|