aiecs 1.5.1__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.
- aiecs/__init__.py +72 -0
- aiecs/__main__.py +41 -0
- aiecs/aiecs_client.py +469 -0
- aiecs/application/__init__.py +10 -0
- aiecs/application/executors/__init__.py +10 -0
- aiecs/application/executors/operation_executor.py +363 -0
- aiecs/application/knowledge_graph/__init__.py +7 -0
- aiecs/application/knowledge_graph/builder/__init__.py +37 -0
- aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
- aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
- aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
- aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
- aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
- aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
- aiecs/application/knowledge_graph/extractors/base.py +100 -0
- aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
- aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
- aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
- aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
- aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
- aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
- aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
- aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
- aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
- aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
- aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
- aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
- aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -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 +347 -0
- aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
- aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -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 +630 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
- aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
- aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
- aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
- aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
- aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
- aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
- aiecs/application/knowledge_graph/search/__init__.py +59 -0
- aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
- aiecs/application/knowledge_graph/search/reranker.py +295 -0
- aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
- aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
- aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
- aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
- aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
- aiecs/application/knowledge_graph/validators/__init__.py +13 -0
- aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
- aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
- aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
- aiecs/common/__init__.py +9 -0
- aiecs/common/knowledge_graph/__init__.py +17 -0
- aiecs/common/knowledge_graph/runnable.py +484 -0
- aiecs/config/__init__.py +16 -0
- aiecs/config/config.py +498 -0
- aiecs/config/graph_config.py +137 -0
- aiecs/config/registry.py +23 -0
- aiecs/core/__init__.py +46 -0
- aiecs/core/interface/__init__.py +34 -0
- aiecs/core/interface/execution_interface.py +152 -0
- aiecs/core/interface/storage_interface.py +171 -0
- aiecs/domain/__init__.py +289 -0
- aiecs/domain/agent/__init__.py +189 -0
- aiecs/domain/agent/base_agent.py +697 -0
- aiecs/domain/agent/exceptions.py +103 -0
- aiecs/domain/agent/graph_aware_mixin.py +559 -0
- aiecs/domain/agent/hybrid_agent.py +490 -0
- aiecs/domain/agent/integration/__init__.py +26 -0
- aiecs/domain/agent/integration/context_compressor.py +222 -0
- aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
- aiecs/domain/agent/integration/retry_policy.py +219 -0
- aiecs/domain/agent/integration/role_config.py +213 -0
- aiecs/domain/agent/knowledge_aware_agent.py +646 -0
- aiecs/domain/agent/lifecycle.py +296 -0
- aiecs/domain/agent/llm_agent.py +300 -0
- aiecs/domain/agent/memory/__init__.py +12 -0
- aiecs/domain/agent/memory/conversation.py +197 -0
- aiecs/domain/agent/migration/__init__.py +14 -0
- aiecs/domain/agent/migration/conversion.py +160 -0
- aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
- aiecs/domain/agent/models.py +317 -0
- aiecs/domain/agent/observability.py +407 -0
- aiecs/domain/agent/persistence.py +289 -0
- aiecs/domain/agent/prompts/__init__.py +29 -0
- aiecs/domain/agent/prompts/builder.py +161 -0
- aiecs/domain/agent/prompts/formatters.py +189 -0
- aiecs/domain/agent/prompts/template.py +255 -0
- aiecs/domain/agent/registry.py +260 -0
- aiecs/domain/agent/tool_agent.py +257 -0
- aiecs/domain/agent/tools/__init__.py +12 -0
- aiecs/domain/agent/tools/schema_generator.py +221 -0
- aiecs/domain/community/__init__.py +155 -0
- aiecs/domain/community/agent_adapter.py +477 -0
- aiecs/domain/community/analytics.py +481 -0
- aiecs/domain/community/collaborative_workflow.py +642 -0
- aiecs/domain/community/communication_hub.py +645 -0
- aiecs/domain/community/community_builder.py +320 -0
- aiecs/domain/community/community_integration.py +800 -0
- aiecs/domain/community/community_manager.py +813 -0
- aiecs/domain/community/decision_engine.py +879 -0
- aiecs/domain/community/exceptions.py +225 -0
- aiecs/domain/community/models/__init__.py +33 -0
- aiecs/domain/community/models/community_models.py +268 -0
- aiecs/domain/community/resource_manager.py +457 -0
- aiecs/domain/community/shared_context_manager.py +603 -0
- aiecs/domain/context/__init__.py +58 -0
- aiecs/domain/context/context_engine.py +989 -0
- aiecs/domain/context/conversation_models.py +354 -0
- aiecs/domain/context/graph_memory.py +467 -0
- aiecs/domain/execution/__init__.py +12 -0
- aiecs/domain/execution/model.py +57 -0
- aiecs/domain/knowledge_graph/__init__.py +19 -0
- aiecs/domain/knowledge_graph/models/__init__.py +52 -0
- aiecs/domain/knowledge_graph/models/entity.py +130 -0
- aiecs/domain/knowledge_graph/models/evidence.py +194 -0
- aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
- aiecs/domain/knowledge_graph/models/path.py +179 -0
- aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
- aiecs/domain/knowledge_graph/models/query.py +272 -0
- aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
- aiecs/domain/knowledge_graph/models/relation.py +136 -0
- aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
- aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
- aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
- aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
- aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
- aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
- aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
- aiecs/domain/task/__init__.py +13 -0
- aiecs/domain/task/dsl_processor.py +613 -0
- aiecs/domain/task/model.py +62 -0
- aiecs/domain/task/task_context.py +268 -0
- aiecs/infrastructure/__init__.py +24 -0
- aiecs/infrastructure/graph_storage/__init__.py +11 -0
- aiecs/infrastructure/graph_storage/base.py +601 -0
- aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
- aiecs/infrastructure/graph_storage/cache.py +429 -0
- aiecs/infrastructure/graph_storage/distributed.py +226 -0
- aiecs/infrastructure/graph_storage/error_handling.py +390 -0
- aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
- aiecs/infrastructure/graph_storage/health_checks.py +378 -0
- aiecs/infrastructure/graph_storage/in_memory.py +514 -0
- aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
- aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
- aiecs/infrastructure/graph_storage/metrics.py +357 -0
- aiecs/infrastructure/graph_storage/migration.py +413 -0
- aiecs/infrastructure/graph_storage/pagination.py +471 -0
- aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
- aiecs/infrastructure/graph_storage/postgres.py +871 -0
- aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
- aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
- aiecs/infrastructure/graph_storage/sqlite.py +623 -0
- aiecs/infrastructure/graph_storage/streaming.py +495 -0
- aiecs/infrastructure/messaging/__init__.py +13 -0
- aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
- aiecs/infrastructure/messaging/websocket_manager.py +298 -0
- aiecs/infrastructure/monitoring/__init__.py +34 -0
- aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
- aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
- aiecs/infrastructure/monitoring/structured_logger.py +48 -0
- aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
- aiecs/infrastructure/persistence/__init__.py +24 -0
- aiecs/infrastructure/persistence/context_engine_client.py +187 -0
- aiecs/infrastructure/persistence/database_manager.py +333 -0
- aiecs/infrastructure/persistence/file_storage.py +754 -0
- aiecs/infrastructure/persistence/redis_client.py +220 -0
- aiecs/llm/__init__.py +86 -0
- aiecs/llm/callbacks/__init__.py +11 -0
- aiecs/llm/callbacks/custom_callbacks.py +264 -0
- aiecs/llm/client_factory.py +420 -0
- aiecs/llm/clients/__init__.py +33 -0
- aiecs/llm/clients/base_client.py +193 -0
- aiecs/llm/clients/googleai_client.py +181 -0
- aiecs/llm/clients/openai_client.py +131 -0
- aiecs/llm/clients/vertex_client.py +437 -0
- aiecs/llm/clients/xai_client.py +184 -0
- aiecs/llm/config/__init__.py +51 -0
- aiecs/llm/config/config_loader.py +275 -0
- aiecs/llm/config/config_validator.py +236 -0
- aiecs/llm/config/model_config.py +151 -0
- aiecs/llm/utils/__init__.py +10 -0
- aiecs/llm/utils/validate_config.py +91 -0
- aiecs/main.py +363 -0
- aiecs/scripts/__init__.py +3 -0
- aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
- aiecs/scripts/aid/__init__.py +19 -0
- aiecs/scripts/aid/version_manager.py +215 -0
- aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
- aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
- aiecs/scripts/dependance_check/__init__.py +17 -0
- aiecs/scripts/dependance_check/dependency_checker.py +938 -0
- aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
- aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
- aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
- aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
- aiecs/scripts/dependance_patch/__init__.py +7 -0
- aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
- aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
- aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
- aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
- aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
- aiecs/scripts/tools_develop/README.md +449 -0
- aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
- aiecs/scripts/tools_develop/__init__.py +21 -0
- aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
- aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
- aiecs/scripts/tools_develop/verify_tools.py +356 -0
- aiecs/tasks/__init__.py +1 -0
- aiecs/tasks/worker.py +172 -0
- aiecs/tools/__init__.py +299 -0
- aiecs/tools/apisource/__init__.py +99 -0
- aiecs/tools/apisource/intelligence/__init__.py +19 -0
- aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
- aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
- aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
- aiecs/tools/apisource/monitoring/__init__.py +9 -0
- aiecs/tools/apisource/monitoring/metrics.py +303 -0
- aiecs/tools/apisource/providers/__init__.py +115 -0
- aiecs/tools/apisource/providers/base.py +664 -0
- aiecs/tools/apisource/providers/census.py +401 -0
- aiecs/tools/apisource/providers/fred.py +564 -0
- aiecs/tools/apisource/providers/newsapi.py +412 -0
- aiecs/tools/apisource/providers/worldbank.py +357 -0
- aiecs/tools/apisource/reliability/__init__.py +12 -0
- aiecs/tools/apisource/reliability/error_handler.py +375 -0
- aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
- aiecs/tools/apisource/tool.py +850 -0
- aiecs/tools/apisource/utils/__init__.py +9 -0
- aiecs/tools/apisource/utils/validators.py +338 -0
- aiecs/tools/base_tool.py +201 -0
- aiecs/tools/docs/__init__.py +121 -0
- aiecs/tools/docs/ai_document_orchestrator.py +599 -0
- aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
- aiecs/tools/docs/content_insertion_tool.py +1333 -0
- aiecs/tools/docs/document_creator_tool.py +1317 -0
- aiecs/tools/docs/document_layout_tool.py +1166 -0
- aiecs/tools/docs/document_parser_tool.py +994 -0
- aiecs/tools/docs/document_writer_tool.py +1818 -0
- aiecs/tools/knowledge_graph/__init__.py +17 -0
- aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
- aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
- aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
- aiecs/tools/langchain_adapter.py +542 -0
- aiecs/tools/schema_generator.py +275 -0
- aiecs/tools/search_tool/__init__.py +100 -0
- aiecs/tools/search_tool/analyzers.py +589 -0
- aiecs/tools/search_tool/cache.py +260 -0
- aiecs/tools/search_tool/constants.py +128 -0
- aiecs/tools/search_tool/context.py +216 -0
- aiecs/tools/search_tool/core.py +749 -0
- aiecs/tools/search_tool/deduplicator.py +123 -0
- aiecs/tools/search_tool/error_handler.py +271 -0
- aiecs/tools/search_tool/metrics.py +371 -0
- aiecs/tools/search_tool/rate_limiter.py +178 -0
- aiecs/tools/search_tool/schemas.py +277 -0
- aiecs/tools/statistics/__init__.py +80 -0
- aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
- aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
- aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
- aiecs/tools/statistics/data_loader_tool.py +564 -0
- aiecs/tools/statistics/data_profiler_tool.py +658 -0
- aiecs/tools/statistics/data_transformer_tool.py +573 -0
- aiecs/tools/statistics/data_visualizer_tool.py +495 -0
- aiecs/tools/statistics/model_trainer_tool.py +487 -0
- aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
- aiecs/tools/task_tools/__init__.py +86 -0
- aiecs/tools/task_tools/chart_tool.py +732 -0
- aiecs/tools/task_tools/classfire_tool.py +922 -0
- aiecs/tools/task_tools/image_tool.py +447 -0
- aiecs/tools/task_tools/office_tool.py +684 -0
- aiecs/tools/task_tools/pandas_tool.py +635 -0
- aiecs/tools/task_tools/report_tool.py +635 -0
- aiecs/tools/task_tools/research_tool.py +392 -0
- aiecs/tools/task_tools/scraper_tool.py +715 -0
- aiecs/tools/task_tools/stats_tool.py +688 -0
- aiecs/tools/temp_file_manager.py +130 -0
- aiecs/tools/tool_executor/__init__.py +37 -0
- aiecs/tools/tool_executor/tool_executor.py +881 -0
- aiecs/utils/LLM_output_structor.py +445 -0
- aiecs/utils/__init__.py +34 -0
- aiecs/utils/base_callback.py +47 -0
- aiecs/utils/cache_provider.py +695 -0
- aiecs/utils/execution_utils.py +184 -0
- aiecs/utils/logging.py +1 -0
- aiecs/utils/prompt_loader.py +14 -0
- aiecs/utils/token_usage_repository.py +323 -0
- aiecs/ws/__init__.py +0 -0
- aiecs/ws/socket_server.py +52 -0
- aiecs-1.5.1.dist-info/METADATA +608 -0
- aiecs-1.5.1.dist-info/RECORD +302 -0
- aiecs-1.5.1.dist-info/WHEEL +5 -0
- aiecs-1.5.1.dist-info/entry_points.txt +10 -0
- aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
- aiecs-1.5.1.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Dict, List, Any
|
|
4
|
+
from aiecs.tools import get_tool
|
|
5
|
+
from aiecs.tools.tool_executor import ToolExecutor
|
|
6
|
+
from aiecs.utils.execution_utils import ExecutionUtils
|
|
7
|
+
from aiecs.domain.execution.model import TaskStepResult, TaskStatus, ErrorCode
|
|
8
|
+
|
|
9
|
+
logger = logging.getLogger(__name__)
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class OperationExecutor:
|
|
13
|
+
"""
|
|
14
|
+
Core logic for handling operation execution
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
tool_executor: ToolExecutor,
|
|
20
|
+
execution_utils: ExecutionUtils,
|
|
21
|
+
config: Dict[str, Any],
|
|
22
|
+
):
|
|
23
|
+
self.tool_executor = tool_executor
|
|
24
|
+
self.execution_utils = execution_utils
|
|
25
|
+
self.config = config
|
|
26
|
+
self._tool_instances = {}
|
|
27
|
+
self.semaphore = asyncio.Semaphore(config.get("rate_limit_requests_per_second", 5))
|
|
28
|
+
|
|
29
|
+
def _filter_tool_params(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
30
|
+
"""
|
|
31
|
+
Filter out system-related parameters, keeping only parameters needed by tool methods
|
|
32
|
+
"""
|
|
33
|
+
# System-related parameters that should not be passed to tool methods
|
|
34
|
+
system_params = {"user_id", "task_id", "op"}
|
|
35
|
+
return {k: v for k, v in params.items() if k not in system_params}
|
|
36
|
+
|
|
37
|
+
def _filter_tool_call_params(self, params: Dict[str, Any]) -> Dict[str, Any]:
|
|
38
|
+
"""
|
|
39
|
+
Filter out system-related parameters in tool calls, but keep 'op' parameter (needed by BaseTool.run())
|
|
40
|
+
"""
|
|
41
|
+
# Only filter user and task IDs, keep 'op' parameter for BaseTool.run()
|
|
42
|
+
# to use
|
|
43
|
+
system_params = {"user_id", "task_id"}
|
|
44
|
+
return {k: v for k, v in params.items() if k not in system_params}
|
|
45
|
+
|
|
46
|
+
async def execute_operation(self, operation_spec: str, params: Dict[str, Any]) -> Any:
|
|
47
|
+
"""
|
|
48
|
+
Execute a single operation (tool_name.operation_name)
|
|
49
|
+
"""
|
|
50
|
+
if "." not in operation_spec:
|
|
51
|
+
raise ValueError(
|
|
52
|
+
f"Invalid operation spec: {operation_spec}, expected 'tool_name.operation_name'"
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
tool_name, operation_name = operation_spec.split(".", 1)
|
|
56
|
+
|
|
57
|
+
# Get or create tool instance
|
|
58
|
+
if tool_name not in self._tool_instances:
|
|
59
|
+
self._tool_instances[tool_name] = get_tool(tool_name)
|
|
60
|
+
|
|
61
|
+
tool = self._tool_instances[tool_name]
|
|
62
|
+
if not hasattr(tool, operation_name):
|
|
63
|
+
raise ValueError(f"Operation '{operation_name}' not found in tool '{tool_name}'")
|
|
64
|
+
|
|
65
|
+
# Filter parameters, remove system-related parameters
|
|
66
|
+
tool_params = self._filter_tool_params(params)
|
|
67
|
+
|
|
68
|
+
# Use ToolExecutor to execute operation
|
|
69
|
+
operation = getattr(tool, operation_name)
|
|
70
|
+
if asyncio.iscoroutinefunction(operation):
|
|
71
|
+
return await self.tool_executor.execute_async(tool, operation_name, **tool_params)
|
|
72
|
+
else:
|
|
73
|
+
return self.tool_executor.execute(tool, operation_name, **tool_params)
|
|
74
|
+
|
|
75
|
+
async def batch_execute_operations(self, operations: List[Dict[str, Any]]) -> List[Any]:
|
|
76
|
+
"""
|
|
77
|
+
Batch execute operations with rate limiting
|
|
78
|
+
"""
|
|
79
|
+
results = []
|
|
80
|
+
batch_size = self.config.get("batch_size", 10)
|
|
81
|
+
rate_limit = self.config.get("rate_limit_requests_per_second", 5)
|
|
82
|
+
|
|
83
|
+
for i in range(0, len(operations), batch_size):
|
|
84
|
+
batch = operations[i : i + batch_size]
|
|
85
|
+
batch_results = await asyncio.gather(
|
|
86
|
+
*[self.execute_operation(op["operation"], op.get("params", {})) for op in batch],
|
|
87
|
+
return_exceptions=True,
|
|
88
|
+
)
|
|
89
|
+
results.extend(batch_results)
|
|
90
|
+
await asyncio.sleep(1.0 / rate_limit)
|
|
91
|
+
|
|
92
|
+
return results
|
|
93
|
+
|
|
94
|
+
async def execute_operations_sequence(
|
|
95
|
+
self,
|
|
96
|
+
operations: List[Dict[str, Any]],
|
|
97
|
+
user_id: str,
|
|
98
|
+
task_id: str,
|
|
99
|
+
stop_on_failure: bool = False,
|
|
100
|
+
save_callback=None,
|
|
101
|
+
) -> List[TaskStepResult]:
|
|
102
|
+
"""
|
|
103
|
+
Execute operations sequence sequentially, with option to stop on failure
|
|
104
|
+
"""
|
|
105
|
+
results = []
|
|
106
|
+
|
|
107
|
+
for step, op_info in enumerate(operations):
|
|
108
|
+
operation_spec = op_info.get("operation")
|
|
109
|
+
params = op_info.get("params", {})
|
|
110
|
+
|
|
111
|
+
# Process parameter references
|
|
112
|
+
processed_params = self._process_param_references(params, results)
|
|
113
|
+
|
|
114
|
+
try:
|
|
115
|
+
result = await self.execute_operation(operation_spec, processed_params)
|
|
116
|
+
step_result = TaskStepResult(
|
|
117
|
+
step=operation_spec,
|
|
118
|
+
result=result,
|
|
119
|
+
completed=True,
|
|
120
|
+
message=f"Completed operation {operation_spec}",
|
|
121
|
+
status=TaskStatus.COMPLETED.value,
|
|
122
|
+
)
|
|
123
|
+
except Exception as e:
|
|
124
|
+
step_result = TaskStepResult(
|
|
125
|
+
step=operation_spec,
|
|
126
|
+
result=None,
|
|
127
|
+
completed=False,
|
|
128
|
+
message=f"Failed to execute {operation_spec}",
|
|
129
|
+
status=TaskStatus.FAILED.value,
|
|
130
|
+
error_code=ErrorCode.EXECUTION_ERROR.value,
|
|
131
|
+
error_message=str(e),
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
if stop_on_failure:
|
|
135
|
+
if save_callback:
|
|
136
|
+
await save_callback(user_id, task_id, step, step_result)
|
|
137
|
+
results.append(step_result)
|
|
138
|
+
break
|
|
139
|
+
|
|
140
|
+
# Save step result
|
|
141
|
+
if save_callback:
|
|
142
|
+
await save_callback(user_id, task_id, step, step_result)
|
|
143
|
+
|
|
144
|
+
results.append(step_result)
|
|
145
|
+
|
|
146
|
+
return results
|
|
147
|
+
|
|
148
|
+
def _process_param_references(
|
|
149
|
+
self, params: Dict[str, Any], results: List[TaskStepResult]
|
|
150
|
+
) -> Dict[str, Any]:
|
|
151
|
+
"""
|
|
152
|
+
Process parameter references, such as $result[0] in operation parameters
|
|
153
|
+
"""
|
|
154
|
+
processed = {}
|
|
155
|
+
|
|
156
|
+
for name, value in params.items():
|
|
157
|
+
if isinstance(value, str) and value.startswith("$result["):
|
|
158
|
+
try:
|
|
159
|
+
ref_parts = value[8:].split("]", 1)
|
|
160
|
+
idx = int(ref_parts[0])
|
|
161
|
+
|
|
162
|
+
if idx >= len(results):
|
|
163
|
+
raise ValueError(f"Referenced result index {idx} out of range")
|
|
164
|
+
|
|
165
|
+
ref_value = results[idx].result
|
|
166
|
+
|
|
167
|
+
# Handle nested attribute access, such as
|
|
168
|
+
# $result[0].data.field
|
|
169
|
+
if len(ref_parts) > 1 and ref_parts[1].startswith("."):
|
|
170
|
+
for attr in ref_parts[1][1:].split("."):
|
|
171
|
+
if attr:
|
|
172
|
+
if isinstance(ref_value, dict):
|
|
173
|
+
ref_value = ref_value.get(attr)
|
|
174
|
+
else:
|
|
175
|
+
ref_value = getattr(ref_value, attr)
|
|
176
|
+
|
|
177
|
+
processed[name] = ref_value
|
|
178
|
+
except Exception as e:
|
|
179
|
+
logger.error(f"Error processing parameter reference {value}: {e}")
|
|
180
|
+
processed[name] = value
|
|
181
|
+
else:
|
|
182
|
+
processed[name] = value
|
|
183
|
+
|
|
184
|
+
return processed
|
|
185
|
+
|
|
186
|
+
async def batch_tool_calls(self, tool_calls: List[Dict], tool_executor_func=None) -> List[Any]:
|
|
187
|
+
"""
|
|
188
|
+
Execute batch tool calls with rate limiting
|
|
189
|
+
"""
|
|
190
|
+
results = []
|
|
191
|
+
batch_size = self.config.get("batch_size", 10)
|
|
192
|
+
rate_limit = self.config.get("rate_limit_requests_per_second", 5)
|
|
193
|
+
|
|
194
|
+
for i in range(0, len(tool_calls), batch_size):
|
|
195
|
+
batch = tool_calls[i : i + batch_size]
|
|
196
|
+
batch_results = await asyncio.gather(
|
|
197
|
+
*[self._execute_tool_call(call, tool_executor_func) for call in batch],
|
|
198
|
+
return_exceptions=True,
|
|
199
|
+
)
|
|
200
|
+
results.extend(batch_results)
|
|
201
|
+
await asyncio.sleep(1.0 / rate_limit)
|
|
202
|
+
|
|
203
|
+
return results
|
|
204
|
+
|
|
205
|
+
async def _execute_tool_call(self, call: Dict, tool_executor_func=None) -> Any:
|
|
206
|
+
"""
|
|
207
|
+
Execute a single tool call with rate limiting
|
|
208
|
+
"""
|
|
209
|
+
async with self.semaphore:
|
|
210
|
+
tool_name = call.get("tool")
|
|
211
|
+
params = call.get("params", {})
|
|
212
|
+
|
|
213
|
+
# Use context-aware caching
|
|
214
|
+
if self.config.get("enable_cache", True):
|
|
215
|
+
user_id = params.get("user_id", "anonymous")
|
|
216
|
+
task_id = params.get("task_id", "none")
|
|
217
|
+
cache_key = self.execution_utils.generate_cache_key(
|
|
218
|
+
"tool_call", user_id, task_id, (), params
|
|
219
|
+
)
|
|
220
|
+
cached_result = self.execution_utils.get_from_cache(cache_key)
|
|
221
|
+
if cached_result is not None:
|
|
222
|
+
return cached_result
|
|
223
|
+
|
|
224
|
+
# Execute tool call
|
|
225
|
+
if tool_executor_func:
|
|
226
|
+
# Use provided tool executor function
|
|
227
|
+
result = await tool_executor_func(tool_name, params)
|
|
228
|
+
else:
|
|
229
|
+
# Use internal ToolExecutor
|
|
230
|
+
if tool_name not in self._tool_instances:
|
|
231
|
+
self._tool_instances[tool_name] = get_tool(tool_name)
|
|
232
|
+
tool = self._tool_instances[tool_name]
|
|
233
|
+
|
|
234
|
+
# Filter parameters, remove system-related parameters (but keep
|
|
235
|
+
# 'op' parameter)
|
|
236
|
+
tool_params = self._filter_tool_call_params(params)
|
|
237
|
+
# Execute through BaseTool.run method, passing filtered
|
|
238
|
+
# parameters
|
|
239
|
+
result = await self.tool_executor.execute_async(tool, "run", **tool_params)
|
|
240
|
+
|
|
241
|
+
# Cache result
|
|
242
|
+
if self.config.get("enable_cache", True):
|
|
243
|
+
self.execution_utils.add_to_cache(cache_key, result)
|
|
244
|
+
|
|
245
|
+
return result
|
|
246
|
+
|
|
247
|
+
def extract_tool_calls(self, description: str, input_data: Dict, context: Dict) -> List[Dict]:
|
|
248
|
+
"""
|
|
249
|
+
Extract tool calls from description
|
|
250
|
+
"""
|
|
251
|
+
import re
|
|
252
|
+
|
|
253
|
+
tool_calls = []
|
|
254
|
+
tool_pattern = r"\{\{(\w+)\((.*?)\)\}\}"
|
|
255
|
+
matches = re.finditer(tool_pattern, description)
|
|
256
|
+
|
|
257
|
+
for match in matches:
|
|
258
|
+
tool_name = match.group(1)
|
|
259
|
+
params_str = match.group(2)
|
|
260
|
+
params = {}
|
|
261
|
+
|
|
262
|
+
# Parse parameters
|
|
263
|
+
param_pattern = r'(\w+)=["\'](.*?)["\']'
|
|
264
|
+
param_matches = re.finditer(param_pattern, params_str)
|
|
265
|
+
|
|
266
|
+
for param_match in param_matches:
|
|
267
|
+
param_name = param_match.group(1)
|
|
268
|
+
param_value = param_match.group(2)
|
|
269
|
+
|
|
270
|
+
# Handle input data references
|
|
271
|
+
if param_value.startswith("input."):
|
|
272
|
+
key = param_value.split(".", 1)[1]
|
|
273
|
+
param_value = input_data.get(key, "")
|
|
274
|
+
elif param_value.startswith("context."):
|
|
275
|
+
key = param_value.split(".", 1)[1]
|
|
276
|
+
param_value = context.get(key, "")
|
|
277
|
+
|
|
278
|
+
params[param_name] = param_value
|
|
279
|
+
|
|
280
|
+
tool_calls.append({"tool": tool_name, "params": params})
|
|
281
|
+
|
|
282
|
+
return tool_calls
|
|
283
|
+
|
|
284
|
+
async def execute_parallel_operations(
|
|
285
|
+
self, operations: List[Dict[str, Any]]
|
|
286
|
+
) -> List[TaskStepResult]:
|
|
287
|
+
"""
|
|
288
|
+
Execute multiple operations in parallel
|
|
289
|
+
"""
|
|
290
|
+
tasks = []
|
|
291
|
+
|
|
292
|
+
for i, op_info in enumerate(operations):
|
|
293
|
+
operation_spec = op_info.get("operation")
|
|
294
|
+
params = op_info.get("params", {})
|
|
295
|
+
|
|
296
|
+
async def execute_single_op(spec, p, index):
|
|
297
|
+
try:
|
|
298
|
+
result = await self.execute_operation(spec, p)
|
|
299
|
+
return TaskStepResult(
|
|
300
|
+
step=f"parallel_{index}_{spec}",
|
|
301
|
+
result=result,
|
|
302
|
+
completed=True,
|
|
303
|
+
message=f"Completed parallel operation {spec}",
|
|
304
|
+
status=TaskStatus.COMPLETED.value,
|
|
305
|
+
)
|
|
306
|
+
except Exception as e:
|
|
307
|
+
return TaskStepResult(
|
|
308
|
+
step=f"parallel_{index}_{spec}",
|
|
309
|
+
result=None,
|
|
310
|
+
completed=False,
|
|
311
|
+
message=f"Failed parallel operation {spec}",
|
|
312
|
+
status=TaskStatus.FAILED.value,
|
|
313
|
+
error_code=ErrorCode.EXECUTION_ERROR.value,
|
|
314
|
+
error_message=str(e),
|
|
315
|
+
)
|
|
316
|
+
|
|
317
|
+
tasks.append(execute_single_op(operation_spec, params, i))
|
|
318
|
+
|
|
319
|
+
results = await asyncio.gather(*tasks, return_exceptions=True)
|
|
320
|
+
|
|
321
|
+
# Handle exception results
|
|
322
|
+
processed_results = []
|
|
323
|
+
for i, result in enumerate(results):
|
|
324
|
+
if isinstance(result, Exception):
|
|
325
|
+
processed_results.append(
|
|
326
|
+
TaskStepResult(
|
|
327
|
+
step=f"parallel_{i}_error",
|
|
328
|
+
result=None,
|
|
329
|
+
completed=False,
|
|
330
|
+
message="Parallel operation failed with exception",
|
|
331
|
+
status=TaskStatus.FAILED.value,
|
|
332
|
+
error_code=ErrorCode.EXECUTION_ERROR.value,
|
|
333
|
+
error_message=str(result),
|
|
334
|
+
)
|
|
335
|
+
)
|
|
336
|
+
else:
|
|
337
|
+
processed_results.append(result)
|
|
338
|
+
|
|
339
|
+
return processed_results
|
|
340
|
+
|
|
341
|
+
def get_tool_instance(self, tool_name: str):
|
|
342
|
+
"""Get tool instance"""
|
|
343
|
+
if tool_name not in self._tool_instances:
|
|
344
|
+
self._tool_instances[tool_name] = get_tool(tool_name)
|
|
345
|
+
return self._tool_instances[tool_name]
|
|
346
|
+
|
|
347
|
+
def clear_tool_cache(self):
|
|
348
|
+
"""Clear tool instance cache"""
|
|
349
|
+
self._tool_instances.clear()
|
|
350
|
+
logger.info("Tool instance cache cleared")
|
|
351
|
+
|
|
352
|
+
def get_stats(self) -> Dict[str, Any]:
|
|
353
|
+
"""Get operation executor statistics"""
|
|
354
|
+
return {
|
|
355
|
+
"cached_tools": len(self._tool_instances),
|
|
356
|
+
"tool_names": list(self._tool_instances.keys()),
|
|
357
|
+
"semaphore_value": self.semaphore._value,
|
|
358
|
+
"config": {
|
|
359
|
+
"batch_size": self.config.get("batch_size", 10),
|
|
360
|
+
"rate_limit": self.config.get("rate_limit_requests_per_second", 5),
|
|
361
|
+
"enable_cache": self.config.get("enable_cache", True),
|
|
362
|
+
},
|
|
363
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Knowledge Graph Builder Pipeline
|
|
3
|
+
|
|
4
|
+
Orchestrates document-to-graph conversion workflow.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from aiecs.application.knowledge_graph.builder.graph_builder import (
|
|
8
|
+
GraphBuilder,
|
|
9
|
+
)
|
|
10
|
+
from aiecs.application.knowledge_graph.builder.document_builder import (
|
|
11
|
+
DocumentGraphBuilder,
|
|
12
|
+
)
|
|
13
|
+
from aiecs.application.knowledge_graph.builder.text_chunker import TextChunker
|
|
14
|
+
from aiecs.application.knowledge_graph.builder.schema_mapping import (
|
|
15
|
+
SchemaMapping,
|
|
16
|
+
EntityMapping,
|
|
17
|
+
RelationMapping,
|
|
18
|
+
PropertyTransformation,
|
|
19
|
+
TransformationType,
|
|
20
|
+
)
|
|
21
|
+
from aiecs.application.knowledge_graph.builder.structured_pipeline import (
|
|
22
|
+
StructuredDataPipeline,
|
|
23
|
+
ImportResult,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
"GraphBuilder",
|
|
28
|
+
"DocumentGraphBuilder",
|
|
29
|
+
"TextChunker",
|
|
30
|
+
"SchemaMapping",
|
|
31
|
+
"EntityMapping",
|
|
32
|
+
"RelationMapping",
|
|
33
|
+
"PropertyTransformation",
|
|
34
|
+
"TransformationType",
|
|
35
|
+
"StructuredDataPipeline",
|
|
36
|
+
"ImportResult",
|
|
37
|
+
]
|