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,524 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph Builder Tool
|
|
3
|
+
|
|
4
|
+
AIECS tool for building knowledge graphs from text and documents.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import Dict, Any, List, Optional
|
|
8
|
+
from pydantic import BaseModel, Field
|
|
9
|
+
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|
10
|
+
|
|
11
|
+
from aiecs.tools.base_tool import BaseTool
|
|
12
|
+
from aiecs.tools import register_tool
|
|
13
|
+
from aiecs.infrastructure.graph_storage.in_memory import InMemoryGraphStore
|
|
14
|
+
from aiecs.application.knowledge_graph.extractors.llm_entity_extractor import (
|
|
15
|
+
LLMEntityExtractor,
|
|
16
|
+
)
|
|
17
|
+
from aiecs.application.knowledge_graph.extractors.llm_relation_extractor import (
|
|
18
|
+
LLMRelationExtractor,
|
|
19
|
+
)
|
|
20
|
+
from aiecs.application.knowledge_graph.builder.graph_builder import (
|
|
21
|
+
GraphBuilder,
|
|
22
|
+
)
|
|
23
|
+
from aiecs.application.knowledge_graph.builder.document_builder import (
|
|
24
|
+
DocumentGraphBuilder,
|
|
25
|
+
)
|
|
26
|
+
from aiecs.application.knowledge_graph.builder.structured_pipeline import (
|
|
27
|
+
StructuredDataPipeline,
|
|
28
|
+
)
|
|
29
|
+
from aiecs.application.knowledge_graph.builder.schema_mapping import (
|
|
30
|
+
SchemaMapping,
|
|
31
|
+
EntityMapping,
|
|
32
|
+
RelationMapping,
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class KGBuilderInput(BaseModel):
|
|
37
|
+
"""Input schema for Knowledge Graph Builder Tool (legacy, for execute() method)"""
|
|
38
|
+
|
|
39
|
+
action: str = Field(
|
|
40
|
+
...,
|
|
41
|
+
description="Action to perform: 'build_from_text', 'build_from_document', 'build_from_structured_data', 'get_stats'",
|
|
42
|
+
)
|
|
43
|
+
text: Optional[str] = Field(
|
|
44
|
+
None,
|
|
45
|
+
description="Text to extract knowledge from (for 'build_from_text' action)",
|
|
46
|
+
)
|
|
47
|
+
document_path: Optional[str] = Field(
|
|
48
|
+
None,
|
|
49
|
+
description="Path to document file (for 'build_from_document' action)",
|
|
50
|
+
)
|
|
51
|
+
source: Optional[str] = Field(
|
|
52
|
+
None,
|
|
53
|
+
description="Optional source identifier (document name, URL, etc.)",
|
|
54
|
+
)
|
|
55
|
+
entity_types: Optional[List[str]] = Field(
|
|
56
|
+
None,
|
|
57
|
+
description=("Optional list of entity types to extract " "(e.g., ['Person', 'Company', 'Location'])"),
|
|
58
|
+
)
|
|
59
|
+
data_path: Optional[str] = Field(
|
|
60
|
+
None,
|
|
61
|
+
description="Path to structured data file (CSV, JSON, SPSS, or Excel) for 'build_from_structured_data' action",
|
|
62
|
+
)
|
|
63
|
+
schema_mapping: Optional[Dict[str, Any]] = Field(
|
|
64
|
+
None,
|
|
65
|
+
description="Schema mapping configuration for structured data import (entity_mappings, relation_mappings)",
|
|
66
|
+
)
|
|
67
|
+
relation_types: Optional[List[str]] = Field(
|
|
68
|
+
None,
|
|
69
|
+
description="Optional list of relation types to extract (e.g., ['WORKS_FOR', 'LOCATED_IN'])",
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# Schemas for individual operations - moved to KnowledgeGraphBuilderTool class as inner classes
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
@register_tool("kg_builder")
|
|
77
|
+
class KnowledgeGraphBuilderTool(BaseTool):
|
|
78
|
+
"""
|
|
79
|
+
Knowledge Graph Builder Tool
|
|
80
|
+
|
|
81
|
+
Allows AI agents to build knowledge graphs from text and documents.
|
|
82
|
+
Extracts entities and relations, stores them in a graph database.
|
|
83
|
+
|
|
84
|
+
Actions:
|
|
85
|
+
- build_from_text: Extract knowledge from text
|
|
86
|
+
- build_from_document: Extract knowledge from a document (PDF, DOCX, TXT)
|
|
87
|
+
- get_stats: Get statistics about the knowledge graph
|
|
88
|
+
|
|
89
|
+
Example Usage:
|
|
90
|
+
```python
|
|
91
|
+
# Build from text
|
|
92
|
+
result = tool.execute({
|
|
93
|
+
"action": "build_from_text",
|
|
94
|
+
"text": "Alice works at Tech Corp in San Francisco.",
|
|
95
|
+
"source": "conversation_1"
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
# Build from document
|
|
99
|
+
result = tool.execute({
|
|
100
|
+
"action": "build_from_document",
|
|
101
|
+
"document_path": "/path/to/research_paper.pdf"
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
# Get stats
|
|
105
|
+
stats = tool.execute({
|
|
106
|
+
"action": "get_stats"
|
|
107
|
+
})
|
|
108
|
+
```
|
|
109
|
+
"""
|
|
110
|
+
|
|
111
|
+
# Configuration schema
|
|
112
|
+
class Config(BaseSettings):
|
|
113
|
+
"""Configuration for the Knowledge Graph Builder Tool
|
|
114
|
+
|
|
115
|
+
Automatically reads from environment variables with KG_BUILDER_ prefix.
|
|
116
|
+
Example: KG_BUILDER_CHUNK_SIZE -> chunk_size
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
model_config = SettingsConfigDict(env_prefix="KG_BUILDER_")
|
|
120
|
+
|
|
121
|
+
chunk_size: int = Field(
|
|
122
|
+
default=2000,
|
|
123
|
+
description="Chunk size for document processing",
|
|
124
|
+
)
|
|
125
|
+
enable_deduplication: bool = Field(
|
|
126
|
+
default=True,
|
|
127
|
+
description="Enable entity deduplication",
|
|
128
|
+
)
|
|
129
|
+
enable_linking: bool = Field(
|
|
130
|
+
default=True,
|
|
131
|
+
description="Enable entity linking",
|
|
132
|
+
)
|
|
133
|
+
enable_chunking: bool = Field(
|
|
134
|
+
default=True,
|
|
135
|
+
description="Enable document chunking",
|
|
136
|
+
)
|
|
137
|
+
batch_size: int = Field(
|
|
138
|
+
default=100,
|
|
139
|
+
description="Batch size for structured data import",
|
|
140
|
+
)
|
|
141
|
+
skip_errors: bool = Field(
|
|
142
|
+
default=True,
|
|
143
|
+
description="Skip errors during structured data import",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
# Schema definitions
|
|
147
|
+
class Build_from_textSchema(BaseModel):
|
|
148
|
+
"""Schema for build_from_text operation"""
|
|
149
|
+
|
|
150
|
+
text: str = Field(description="Text content to extract knowledge from")
|
|
151
|
+
source: Optional[str] = Field(
|
|
152
|
+
default="unknown",
|
|
153
|
+
description="Optional source identifier (document name, URL, etc.)",
|
|
154
|
+
)
|
|
155
|
+
entity_types: Optional[List[str]] = Field(
|
|
156
|
+
default=None,
|
|
157
|
+
description="Optional list of entity types to extract (e.g., ['Person', 'Company', 'Location'])",
|
|
158
|
+
)
|
|
159
|
+
relation_types: Optional[List[str]] = Field(
|
|
160
|
+
default=None,
|
|
161
|
+
description="Optional list of relation types to extract (e.g., ['WORKS_FOR', 'LOCATED_IN'])",
|
|
162
|
+
)
|
|
163
|
+
|
|
164
|
+
class Build_from_documentSchema(BaseModel):
|
|
165
|
+
"""Schema for build_from_document operation"""
|
|
166
|
+
|
|
167
|
+
document_path: str = Field(description="Path to document file (PDF, DOCX, TXT, etc.)")
|
|
168
|
+
entity_types: Optional[List[str]] = Field(default=None, description="Optional list of entity types to extract (e.g., ['Person', 'Company', 'Location'])")
|
|
169
|
+
relation_types: Optional[List[str]] = Field(default=None, description="Optional list of relation types to extract (e.g., ['WORKS_FOR', 'LOCATED_IN'])")
|
|
170
|
+
|
|
171
|
+
class Get_statsSchema(BaseModel):
|
|
172
|
+
"""Schema for get_stats operation"""
|
|
173
|
+
|
|
174
|
+
pass # No parameters needed
|
|
175
|
+
|
|
176
|
+
name: str = "kg_builder"
|
|
177
|
+
description: str = """Build knowledge graphs from text and documents.
|
|
178
|
+
|
|
179
|
+
This tool extracts entities (people, companies, locations, etc.) and relations
|
|
180
|
+
between them from text or documents, and stores them in a knowledge graph.
|
|
181
|
+
|
|
182
|
+
Use this tool when you need to:
|
|
183
|
+
- Extract structured knowledge from unstructured text
|
|
184
|
+
- Build a knowledge base from documents
|
|
185
|
+
- Understand relationships between entities in text
|
|
186
|
+
- Create a queryable graph of information
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
input_schema: type[BaseModel] = KGBuilderInput
|
|
190
|
+
|
|
191
|
+
def __init__(self, config: Optional[Dict[str, Any]] = None, **kwargs):
|
|
192
|
+
"""
|
|
193
|
+
Initialize Knowledge Graph Builder Tool.
|
|
194
|
+
|
|
195
|
+
Args:
|
|
196
|
+
config (Dict, optional): Configuration overrides for KG Builder Tool.
|
|
197
|
+
**kwargs: Additional arguments passed to BaseTool (e.g., tool_name)
|
|
198
|
+
|
|
199
|
+
Configuration is automatically loaded by BaseTool from:
|
|
200
|
+
1. Explicit config dict (highest priority)
|
|
201
|
+
2. YAML config files (config/tools/kg_builder.yaml)
|
|
202
|
+
3. Environment variables (via dotenv from .env files)
|
|
203
|
+
4. Tool defaults (lowest priority)
|
|
204
|
+
"""
|
|
205
|
+
super().__init__(config, **kwargs)
|
|
206
|
+
|
|
207
|
+
# Configuration is automatically loaded by BaseTool into self._config_obj
|
|
208
|
+
# Access config via self._config_obj (BaseSettings instance)
|
|
209
|
+
self.config = self._config_obj if self._config_obj else self.Config()
|
|
210
|
+
|
|
211
|
+
# Initialize graph store (in-memory for now)
|
|
212
|
+
# In production, this would be configurable (SQLite, PostgreSQL, etc.)
|
|
213
|
+
self.graph_store = None
|
|
214
|
+
self.graph_builder = None
|
|
215
|
+
self.document_builder = None
|
|
216
|
+
self._initialized = False
|
|
217
|
+
|
|
218
|
+
async def _initialize(self):
|
|
219
|
+
"""Lazy initialization of components"""
|
|
220
|
+
if self._initialized:
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
# Initialize graph store
|
|
224
|
+
self.graph_store = InMemoryGraphStore()
|
|
225
|
+
await self.graph_store.initialize()
|
|
226
|
+
|
|
227
|
+
# Initialize extractors
|
|
228
|
+
entity_extractor = LLMEntityExtractor()
|
|
229
|
+
relation_extractor = LLMRelationExtractor()
|
|
230
|
+
|
|
231
|
+
# Initialize graph builder
|
|
232
|
+
self.graph_builder = GraphBuilder(
|
|
233
|
+
graph_store=self.graph_store,
|
|
234
|
+
entity_extractor=entity_extractor,
|
|
235
|
+
relation_extractor=relation_extractor,
|
|
236
|
+
enable_deduplication=self.config.enable_deduplication,
|
|
237
|
+
enable_linking=self.config.enable_linking,
|
|
238
|
+
)
|
|
239
|
+
|
|
240
|
+
# Initialize document builder
|
|
241
|
+
self.document_builder = DocumentGraphBuilder(
|
|
242
|
+
graph_builder=self.graph_builder,
|
|
243
|
+
chunk_size=self.config.chunk_size,
|
|
244
|
+
enable_chunking=self.config.enable_chunking,
|
|
245
|
+
)
|
|
246
|
+
|
|
247
|
+
self._initialized = True
|
|
248
|
+
|
|
249
|
+
async def _execute(self, **kwargs) -> Dict[str, Any]:
|
|
250
|
+
"""
|
|
251
|
+
Execute the knowledge graph builder tool
|
|
252
|
+
|
|
253
|
+
Args:
|
|
254
|
+
**kwargs: Tool input parameters
|
|
255
|
+
|
|
256
|
+
Returns:
|
|
257
|
+
Dictionary with results
|
|
258
|
+
"""
|
|
259
|
+
# Initialize components
|
|
260
|
+
await self._initialize()
|
|
261
|
+
|
|
262
|
+
action = kwargs.get("action")
|
|
263
|
+
|
|
264
|
+
if action == "build_from_text":
|
|
265
|
+
return await self._build_from_text(kwargs)
|
|
266
|
+
elif action == "build_from_document":
|
|
267
|
+
return await self._build_from_document(kwargs)
|
|
268
|
+
elif action == "build_from_structured_data":
|
|
269
|
+
return await self._build_from_structured_data(kwargs)
|
|
270
|
+
elif action == "get_stats":
|
|
271
|
+
return await self._get_stats()
|
|
272
|
+
else:
|
|
273
|
+
return {
|
|
274
|
+
"success": False,
|
|
275
|
+
"error": (f"Unknown action: {action}. " f"Supported actions: build_from_text, build_from_document, build_from_structured_data, get_stats"),
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
async def _build_from_text(self, kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
|
279
|
+
"""
|
|
280
|
+
Build knowledge graph from text
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
kwargs: Tool input parameters
|
|
284
|
+
|
|
285
|
+
Returns:
|
|
286
|
+
Build result dictionary
|
|
287
|
+
"""
|
|
288
|
+
text = kwargs.get("text")
|
|
289
|
+
if not text:
|
|
290
|
+
return {
|
|
291
|
+
"success": False,
|
|
292
|
+
"error": "Missing required parameter: text",
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
source = kwargs.get("source", "unknown")
|
|
296
|
+
|
|
297
|
+
# Build graph
|
|
298
|
+
result = await self.graph_builder.build_from_text(text=text, source=source)
|
|
299
|
+
|
|
300
|
+
return {
|
|
301
|
+
"success": result.success,
|
|
302
|
+
"entities_added": result.entities_added,
|
|
303
|
+
"relations_added": result.relations_added,
|
|
304
|
+
"entities_linked": result.entities_linked,
|
|
305
|
+
"entities_deduplicated": result.entities_deduplicated,
|
|
306
|
+
"relations_deduplicated": result.relations_deduplicated,
|
|
307
|
+
"duration_seconds": result.duration_seconds,
|
|
308
|
+
"errors": result.errors,
|
|
309
|
+
"warnings": result.warnings,
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
async def _build_from_document(self, kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
|
313
|
+
"""
|
|
314
|
+
Build knowledge graph from document
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
kwargs: Tool input parameters
|
|
318
|
+
|
|
319
|
+
Returns:
|
|
320
|
+
Build result dictionary
|
|
321
|
+
"""
|
|
322
|
+
document_path = kwargs.get("document_path")
|
|
323
|
+
if not document_path:
|
|
324
|
+
return {
|
|
325
|
+
"success": False,
|
|
326
|
+
"error": "Missing required parameter: document_path",
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
# Build graph from document
|
|
330
|
+
result = await self.document_builder.build_from_document(document_path)
|
|
331
|
+
|
|
332
|
+
return {
|
|
333
|
+
"success": result.success,
|
|
334
|
+
"document_path": result.document_path,
|
|
335
|
+
"document_type": result.document_type,
|
|
336
|
+
"total_chunks": result.total_chunks,
|
|
337
|
+
"chunks_processed": result.chunks_processed,
|
|
338
|
+
"total_entities_added": result.total_entities_added,
|
|
339
|
+
"total_relations_added": result.total_relations_added,
|
|
340
|
+
"errors": result.errors,
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
async def _build_from_structured_data(self, kwargs: Dict[str, Any]) -> Dict[str, Any]:
|
|
344
|
+
"""
|
|
345
|
+
Build knowledge graph from structured data (CSV, JSON, SPSS, or Excel)
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
kwargs: Tool input parameters
|
|
349
|
+
|
|
350
|
+
Returns:
|
|
351
|
+
Build result dictionary
|
|
352
|
+
"""
|
|
353
|
+
data_path = kwargs.get("data_path")
|
|
354
|
+
if not data_path:
|
|
355
|
+
return {
|
|
356
|
+
"success": False,
|
|
357
|
+
"error": "Missing required parameter: data_path",
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
schema_mapping_dict = kwargs.get("schema_mapping")
|
|
361
|
+
if not schema_mapping_dict:
|
|
362
|
+
return {
|
|
363
|
+
"success": False,
|
|
364
|
+
"error": "Missing required parameter: schema_mapping",
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
try:
|
|
368
|
+
# Parse schema mapping
|
|
369
|
+
entity_mappings = []
|
|
370
|
+
for em_dict in schema_mapping_dict.get("entity_mappings", []):
|
|
371
|
+
entity_mappings.append(EntityMapping(**em_dict))
|
|
372
|
+
|
|
373
|
+
relation_mappings = []
|
|
374
|
+
for rm_dict in schema_mapping_dict.get("relation_mappings", []):
|
|
375
|
+
relation_mappings.append(RelationMapping(**rm_dict))
|
|
376
|
+
|
|
377
|
+
schema_mapping = SchemaMapping(
|
|
378
|
+
entity_mappings=entity_mappings,
|
|
379
|
+
relation_mappings=relation_mappings,
|
|
380
|
+
)
|
|
381
|
+
|
|
382
|
+
# Create structured data pipeline
|
|
383
|
+
pipeline = StructuredDataPipeline(
|
|
384
|
+
mapping=schema_mapping,
|
|
385
|
+
graph_store=self.graph_store,
|
|
386
|
+
batch_size=self.config.batch_size,
|
|
387
|
+
skip_errors=self.config.skip_errors,
|
|
388
|
+
)
|
|
389
|
+
|
|
390
|
+
# Import data based on file extension
|
|
391
|
+
if data_path.endswith(".csv"):
|
|
392
|
+
result = await pipeline.import_from_csv(data_path)
|
|
393
|
+
elif data_path.endswith(".json"):
|
|
394
|
+
result = await pipeline.import_from_json(data_path)
|
|
395
|
+
elif data_path.endswith(".sav") or data_path.endswith(".por"):
|
|
396
|
+
result = await pipeline.import_from_spss(data_path)
|
|
397
|
+
elif data_path.endswith(".xlsx") or data_path.endswith(".xls"):
|
|
398
|
+
result = await pipeline.import_from_excel(data_path)
|
|
399
|
+
else:
|
|
400
|
+
return {
|
|
401
|
+
"success": False,
|
|
402
|
+
"error": "Unsupported file format. Supported: .csv, .json, .sav, .por, .xlsx, .xls",
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
return {
|
|
406
|
+
"success": result.success,
|
|
407
|
+
"data_path": data_path,
|
|
408
|
+
"entities_added": result.entities_added,
|
|
409
|
+
"relations_added": result.relations_added,
|
|
410
|
+
"rows_processed": result.rows_processed,
|
|
411
|
+
"rows_failed": result.rows_failed,
|
|
412
|
+
"duration_seconds": result.duration_seconds,
|
|
413
|
+
"errors": result.errors,
|
|
414
|
+
"warnings": result.warnings,
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
except Exception as e:
|
|
418
|
+
return {
|
|
419
|
+
"success": False,
|
|
420
|
+
"error": f"Failed to import structured data: {str(e)}",
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
async def _get_stats(self) -> Dict[str, Any]:
|
|
424
|
+
"""
|
|
425
|
+
Get knowledge graph statistics
|
|
426
|
+
|
|
427
|
+
Returns:
|
|
428
|
+
Statistics dictionary
|
|
429
|
+
"""
|
|
430
|
+
# Handle both async and sync get_stats methods
|
|
431
|
+
if hasattr(self.graph_store.get_stats, "__call__"):
|
|
432
|
+
stats_result = self.graph_store.get_stats()
|
|
433
|
+
# Check if it's a coroutine
|
|
434
|
+
if hasattr(stats_result, "__await__"):
|
|
435
|
+
stats = await stats_result
|
|
436
|
+
else:
|
|
437
|
+
stats = stats_result
|
|
438
|
+
else:
|
|
439
|
+
stats = self.graph_store.get_stats()
|
|
440
|
+
|
|
441
|
+
return {"success": True, "stats": stats}
|
|
442
|
+
|
|
443
|
+
# Public methods for ToolExecutor integration
|
|
444
|
+
async def build_from_text(
|
|
445
|
+
self,
|
|
446
|
+
text: str,
|
|
447
|
+
source: Optional[str] = "unknown",
|
|
448
|
+
entity_types: Optional[List[str]] = None,
|
|
449
|
+
relation_types: Optional[List[str]] = None,
|
|
450
|
+
) -> Dict[str, Any]:
|
|
451
|
+
"""
|
|
452
|
+
Build knowledge graph from text (public method for ToolExecutor)
|
|
453
|
+
|
|
454
|
+
Args:
|
|
455
|
+
text: Text to extract knowledge from
|
|
456
|
+
source: Optional source identifier
|
|
457
|
+
entity_types: Optional list of entity types to extract
|
|
458
|
+
relation_types: Optional list of relation types to extract
|
|
459
|
+
|
|
460
|
+
Returns:
|
|
461
|
+
Build result dictionary
|
|
462
|
+
"""
|
|
463
|
+
await self._initialize()
|
|
464
|
+
return await self._build_from_text(
|
|
465
|
+
{
|
|
466
|
+
"text": text,
|
|
467
|
+
"source": source,
|
|
468
|
+
"entity_types": entity_types,
|
|
469
|
+
"relation_types": relation_types,
|
|
470
|
+
}
|
|
471
|
+
)
|
|
472
|
+
|
|
473
|
+
async def build_from_document(
|
|
474
|
+
self,
|
|
475
|
+
document_path: str,
|
|
476
|
+
entity_types: Optional[List[str]] = None,
|
|
477
|
+
relation_types: Optional[List[str]] = None,
|
|
478
|
+
) -> Dict[str, Any]:
|
|
479
|
+
"""
|
|
480
|
+
Build knowledge graph from document (public method for ToolExecutor)
|
|
481
|
+
|
|
482
|
+
Args:
|
|
483
|
+
document_path: Path to document file
|
|
484
|
+
entity_types: Optional list of entity types to extract
|
|
485
|
+
relation_types: Optional list of relation types to extract
|
|
486
|
+
|
|
487
|
+
Returns:
|
|
488
|
+
Build result dictionary
|
|
489
|
+
"""
|
|
490
|
+
await self._initialize()
|
|
491
|
+
return await self._build_from_document(
|
|
492
|
+
{
|
|
493
|
+
"document_path": document_path,
|
|
494
|
+
"entity_types": entity_types,
|
|
495
|
+
"relation_types": relation_types,
|
|
496
|
+
}
|
|
497
|
+
)
|
|
498
|
+
|
|
499
|
+
async def get_stats(self) -> Dict[str, Any]:
|
|
500
|
+
"""
|
|
501
|
+
Get knowledge graph statistics (public method for ToolExecutor)
|
|
502
|
+
|
|
503
|
+
Returns:
|
|
504
|
+
Statistics dictionary
|
|
505
|
+
"""
|
|
506
|
+
await self._initialize()
|
|
507
|
+
return await self._get_stats()
|
|
508
|
+
|
|
509
|
+
async def execute(self, **kwargs) -> Dict[str, Any]:
|
|
510
|
+
"""
|
|
511
|
+
Execute the tool (public interface)
|
|
512
|
+
|
|
513
|
+
Args:
|
|
514
|
+
**kwargs: Tool input parameters
|
|
515
|
+
|
|
516
|
+
Returns:
|
|
517
|
+
Dictionary with results
|
|
518
|
+
"""
|
|
519
|
+
return await self._execute(**kwargs)
|
|
520
|
+
|
|
521
|
+
async def close(self):
|
|
522
|
+
"""Clean up resources"""
|
|
523
|
+
if self.graph_store and self._initialized:
|
|
524
|
+
await self.graph_store.close()
|