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.
Files changed (302) hide show
  1. aiecs/__init__.py +72 -0
  2. aiecs/__main__.py +41 -0
  3. aiecs/aiecs_client.py +469 -0
  4. aiecs/application/__init__.py +10 -0
  5. aiecs/application/executors/__init__.py +10 -0
  6. aiecs/application/executors/operation_executor.py +363 -0
  7. aiecs/application/knowledge_graph/__init__.py +7 -0
  8. aiecs/application/knowledge_graph/builder/__init__.py +37 -0
  9. aiecs/application/knowledge_graph/builder/document_builder.py +375 -0
  10. aiecs/application/knowledge_graph/builder/graph_builder.py +356 -0
  11. aiecs/application/knowledge_graph/builder/schema_mapping.py +531 -0
  12. aiecs/application/knowledge_graph/builder/structured_pipeline.py +443 -0
  13. aiecs/application/knowledge_graph/builder/text_chunker.py +319 -0
  14. aiecs/application/knowledge_graph/extractors/__init__.py +27 -0
  15. aiecs/application/knowledge_graph/extractors/base.py +100 -0
  16. aiecs/application/knowledge_graph/extractors/llm_entity_extractor.py +327 -0
  17. aiecs/application/knowledge_graph/extractors/llm_relation_extractor.py +349 -0
  18. aiecs/application/knowledge_graph/extractors/ner_entity_extractor.py +244 -0
  19. aiecs/application/knowledge_graph/fusion/__init__.py +23 -0
  20. aiecs/application/knowledge_graph/fusion/entity_deduplicator.py +387 -0
  21. aiecs/application/knowledge_graph/fusion/entity_linker.py +343 -0
  22. aiecs/application/knowledge_graph/fusion/knowledge_fusion.py +580 -0
  23. aiecs/application/knowledge_graph/fusion/relation_deduplicator.py +189 -0
  24. aiecs/application/knowledge_graph/pattern_matching/__init__.py +21 -0
  25. aiecs/application/knowledge_graph/pattern_matching/pattern_matcher.py +344 -0
  26. aiecs/application/knowledge_graph/pattern_matching/query_executor.py +378 -0
  27. aiecs/application/knowledge_graph/profiling/__init__.py +12 -0
  28. aiecs/application/knowledge_graph/profiling/query_plan_visualizer.py +199 -0
  29. aiecs/application/knowledge_graph/profiling/query_profiler.py +223 -0
  30. aiecs/application/knowledge_graph/reasoning/__init__.py +27 -0
  31. aiecs/application/knowledge_graph/reasoning/evidence_synthesis.py +347 -0
  32. aiecs/application/knowledge_graph/reasoning/inference_engine.py +504 -0
  33. aiecs/application/knowledge_graph/reasoning/logic_form_parser.py +167 -0
  34. aiecs/application/knowledge_graph/reasoning/logic_parser/__init__.py +79 -0
  35. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_builder.py +513 -0
  36. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_nodes.py +630 -0
  37. aiecs/application/knowledge_graph/reasoning/logic_parser/ast_validator.py +654 -0
  38. aiecs/application/knowledge_graph/reasoning/logic_parser/error_handler.py +477 -0
  39. aiecs/application/knowledge_graph/reasoning/logic_parser/parser.py +390 -0
  40. aiecs/application/knowledge_graph/reasoning/logic_parser/query_context.py +217 -0
  41. aiecs/application/knowledge_graph/reasoning/logic_query_integration.py +169 -0
  42. aiecs/application/knowledge_graph/reasoning/query_planner.py +872 -0
  43. aiecs/application/knowledge_graph/reasoning/reasoning_engine.py +554 -0
  44. aiecs/application/knowledge_graph/retrieval/__init__.py +19 -0
  45. aiecs/application/knowledge_graph/retrieval/retrieval_strategies.py +596 -0
  46. aiecs/application/knowledge_graph/search/__init__.py +59 -0
  47. aiecs/application/knowledge_graph/search/hybrid_search.py +423 -0
  48. aiecs/application/knowledge_graph/search/reranker.py +295 -0
  49. aiecs/application/knowledge_graph/search/reranker_strategies.py +553 -0
  50. aiecs/application/knowledge_graph/search/text_similarity.py +398 -0
  51. aiecs/application/knowledge_graph/traversal/__init__.py +15 -0
  52. aiecs/application/knowledge_graph/traversal/enhanced_traversal.py +329 -0
  53. aiecs/application/knowledge_graph/traversal/path_scorer.py +269 -0
  54. aiecs/application/knowledge_graph/validators/__init__.py +13 -0
  55. aiecs/application/knowledge_graph/validators/relation_validator.py +189 -0
  56. aiecs/application/knowledge_graph/visualization/__init__.py +11 -0
  57. aiecs/application/knowledge_graph/visualization/graph_visualizer.py +321 -0
  58. aiecs/common/__init__.py +9 -0
  59. aiecs/common/knowledge_graph/__init__.py +17 -0
  60. aiecs/common/knowledge_graph/runnable.py +484 -0
  61. aiecs/config/__init__.py +16 -0
  62. aiecs/config/config.py +498 -0
  63. aiecs/config/graph_config.py +137 -0
  64. aiecs/config/registry.py +23 -0
  65. aiecs/core/__init__.py +46 -0
  66. aiecs/core/interface/__init__.py +34 -0
  67. aiecs/core/interface/execution_interface.py +152 -0
  68. aiecs/core/interface/storage_interface.py +171 -0
  69. aiecs/domain/__init__.py +289 -0
  70. aiecs/domain/agent/__init__.py +189 -0
  71. aiecs/domain/agent/base_agent.py +697 -0
  72. aiecs/domain/agent/exceptions.py +103 -0
  73. aiecs/domain/agent/graph_aware_mixin.py +559 -0
  74. aiecs/domain/agent/hybrid_agent.py +490 -0
  75. aiecs/domain/agent/integration/__init__.py +26 -0
  76. aiecs/domain/agent/integration/context_compressor.py +222 -0
  77. aiecs/domain/agent/integration/context_engine_adapter.py +252 -0
  78. aiecs/domain/agent/integration/retry_policy.py +219 -0
  79. aiecs/domain/agent/integration/role_config.py +213 -0
  80. aiecs/domain/agent/knowledge_aware_agent.py +646 -0
  81. aiecs/domain/agent/lifecycle.py +296 -0
  82. aiecs/domain/agent/llm_agent.py +300 -0
  83. aiecs/domain/agent/memory/__init__.py +12 -0
  84. aiecs/domain/agent/memory/conversation.py +197 -0
  85. aiecs/domain/agent/migration/__init__.py +14 -0
  86. aiecs/domain/agent/migration/conversion.py +160 -0
  87. aiecs/domain/agent/migration/legacy_wrapper.py +90 -0
  88. aiecs/domain/agent/models.py +317 -0
  89. aiecs/domain/agent/observability.py +407 -0
  90. aiecs/domain/agent/persistence.py +289 -0
  91. aiecs/domain/agent/prompts/__init__.py +29 -0
  92. aiecs/domain/agent/prompts/builder.py +161 -0
  93. aiecs/domain/agent/prompts/formatters.py +189 -0
  94. aiecs/domain/agent/prompts/template.py +255 -0
  95. aiecs/domain/agent/registry.py +260 -0
  96. aiecs/domain/agent/tool_agent.py +257 -0
  97. aiecs/domain/agent/tools/__init__.py +12 -0
  98. aiecs/domain/agent/tools/schema_generator.py +221 -0
  99. aiecs/domain/community/__init__.py +155 -0
  100. aiecs/domain/community/agent_adapter.py +477 -0
  101. aiecs/domain/community/analytics.py +481 -0
  102. aiecs/domain/community/collaborative_workflow.py +642 -0
  103. aiecs/domain/community/communication_hub.py +645 -0
  104. aiecs/domain/community/community_builder.py +320 -0
  105. aiecs/domain/community/community_integration.py +800 -0
  106. aiecs/domain/community/community_manager.py +813 -0
  107. aiecs/domain/community/decision_engine.py +879 -0
  108. aiecs/domain/community/exceptions.py +225 -0
  109. aiecs/domain/community/models/__init__.py +33 -0
  110. aiecs/domain/community/models/community_models.py +268 -0
  111. aiecs/domain/community/resource_manager.py +457 -0
  112. aiecs/domain/community/shared_context_manager.py +603 -0
  113. aiecs/domain/context/__init__.py +58 -0
  114. aiecs/domain/context/context_engine.py +989 -0
  115. aiecs/domain/context/conversation_models.py +354 -0
  116. aiecs/domain/context/graph_memory.py +467 -0
  117. aiecs/domain/execution/__init__.py +12 -0
  118. aiecs/domain/execution/model.py +57 -0
  119. aiecs/domain/knowledge_graph/__init__.py +19 -0
  120. aiecs/domain/knowledge_graph/models/__init__.py +52 -0
  121. aiecs/domain/knowledge_graph/models/entity.py +130 -0
  122. aiecs/domain/knowledge_graph/models/evidence.py +194 -0
  123. aiecs/domain/knowledge_graph/models/inference_rule.py +186 -0
  124. aiecs/domain/knowledge_graph/models/path.py +179 -0
  125. aiecs/domain/knowledge_graph/models/path_pattern.py +173 -0
  126. aiecs/domain/knowledge_graph/models/query.py +272 -0
  127. aiecs/domain/knowledge_graph/models/query_plan.py +187 -0
  128. aiecs/domain/knowledge_graph/models/relation.py +136 -0
  129. aiecs/domain/knowledge_graph/schema/__init__.py +23 -0
  130. aiecs/domain/knowledge_graph/schema/entity_type.py +135 -0
  131. aiecs/domain/knowledge_graph/schema/graph_schema.py +271 -0
  132. aiecs/domain/knowledge_graph/schema/property_schema.py +155 -0
  133. aiecs/domain/knowledge_graph/schema/relation_type.py +171 -0
  134. aiecs/domain/knowledge_graph/schema/schema_manager.py +496 -0
  135. aiecs/domain/knowledge_graph/schema/type_enums.py +205 -0
  136. aiecs/domain/task/__init__.py +13 -0
  137. aiecs/domain/task/dsl_processor.py +613 -0
  138. aiecs/domain/task/model.py +62 -0
  139. aiecs/domain/task/task_context.py +268 -0
  140. aiecs/infrastructure/__init__.py +24 -0
  141. aiecs/infrastructure/graph_storage/__init__.py +11 -0
  142. aiecs/infrastructure/graph_storage/base.py +601 -0
  143. aiecs/infrastructure/graph_storage/batch_operations.py +449 -0
  144. aiecs/infrastructure/graph_storage/cache.py +429 -0
  145. aiecs/infrastructure/graph_storage/distributed.py +226 -0
  146. aiecs/infrastructure/graph_storage/error_handling.py +390 -0
  147. aiecs/infrastructure/graph_storage/graceful_degradation.py +306 -0
  148. aiecs/infrastructure/graph_storage/health_checks.py +378 -0
  149. aiecs/infrastructure/graph_storage/in_memory.py +514 -0
  150. aiecs/infrastructure/graph_storage/index_optimization.py +483 -0
  151. aiecs/infrastructure/graph_storage/lazy_loading.py +410 -0
  152. aiecs/infrastructure/graph_storage/metrics.py +357 -0
  153. aiecs/infrastructure/graph_storage/migration.py +413 -0
  154. aiecs/infrastructure/graph_storage/pagination.py +471 -0
  155. aiecs/infrastructure/graph_storage/performance_monitoring.py +466 -0
  156. aiecs/infrastructure/graph_storage/postgres.py +871 -0
  157. aiecs/infrastructure/graph_storage/query_optimizer.py +635 -0
  158. aiecs/infrastructure/graph_storage/schema_cache.py +290 -0
  159. aiecs/infrastructure/graph_storage/sqlite.py +623 -0
  160. aiecs/infrastructure/graph_storage/streaming.py +495 -0
  161. aiecs/infrastructure/messaging/__init__.py +13 -0
  162. aiecs/infrastructure/messaging/celery_task_manager.py +383 -0
  163. aiecs/infrastructure/messaging/websocket_manager.py +298 -0
  164. aiecs/infrastructure/monitoring/__init__.py +34 -0
  165. aiecs/infrastructure/monitoring/executor_metrics.py +174 -0
  166. aiecs/infrastructure/monitoring/global_metrics_manager.py +213 -0
  167. aiecs/infrastructure/monitoring/structured_logger.py +48 -0
  168. aiecs/infrastructure/monitoring/tracing_manager.py +410 -0
  169. aiecs/infrastructure/persistence/__init__.py +24 -0
  170. aiecs/infrastructure/persistence/context_engine_client.py +187 -0
  171. aiecs/infrastructure/persistence/database_manager.py +333 -0
  172. aiecs/infrastructure/persistence/file_storage.py +754 -0
  173. aiecs/infrastructure/persistence/redis_client.py +220 -0
  174. aiecs/llm/__init__.py +86 -0
  175. aiecs/llm/callbacks/__init__.py +11 -0
  176. aiecs/llm/callbacks/custom_callbacks.py +264 -0
  177. aiecs/llm/client_factory.py +420 -0
  178. aiecs/llm/clients/__init__.py +33 -0
  179. aiecs/llm/clients/base_client.py +193 -0
  180. aiecs/llm/clients/googleai_client.py +181 -0
  181. aiecs/llm/clients/openai_client.py +131 -0
  182. aiecs/llm/clients/vertex_client.py +437 -0
  183. aiecs/llm/clients/xai_client.py +184 -0
  184. aiecs/llm/config/__init__.py +51 -0
  185. aiecs/llm/config/config_loader.py +275 -0
  186. aiecs/llm/config/config_validator.py +236 -0
  187. aiecs/llm/config/model_config.py +151 -0
  188. aiecs/llm/utils/__init__.py +10 -0
  189. aiecs/llm/utils/validate_config.py +91 -0
  190. aiecs/main.py +363 -0
  191. aiecs/scripts/__init__.py +3 -0
  192. aiecs/scripts/aid/VERSION_MANAGEMENT.md +97 -0
  193. aiecs/scripts/aid/__init__.py +19 -0
  194. aiecs/scripts/aid/version_manager.py +215 -0
  195. aiecs/scripts/dependance_check/DEPENDENCY_SYSTEM_SUMMARY.md +242 -0
  196. aiecs/scripts/dependance_check/README_DEPENDENCY_CHECKER.md +310 -0
  197. aiecs/scripts/dependance_check/__init__.py +17 -0
  198. aiecs/scripts/dependance_check/dependency_checker.py +938 -0
  199. aiecs/scripts/dependance_check/dependency_fixer.py +391 -0
  200. aiecs/scripts/dependance_check/download_nlp_data.py +396 -0
  201. aiecs/scripts/dependance_check/quick_dependency_check.py +270 -0
  202. aiecs/scripts/dependance_check/setup_nlp_data.sh +217 -0
  203. aiecs/scripts/dependance_patch/__init__.py +7 -0
  204. aiecs/scripts/dependance_patch/fix_weasel/README_WEASEL_PATCH.md +126 -0
  205. aiecs/scripts/dependance_patch/fix_weasel/__init__.py +11 -0
  206. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.py +128 -0
  207. aiecs/scripts/dependance_patch/fix_weasel/fix_weasel_validator.sh +82 -0
  208. aiecs/scripts/dependance_patch/fix_weasel/patch_weasel_library.sh +188 -0
  209. aiecs/scripts/dependance_patch/fix_weasel/run_weasel_patch.sh +41 -0
  210. aiecs/scripts/tools_develop/README.md +449 -0
  211. aiecs/scripts/tools_develop/TOOL_AUTO_DISCOVERY.md +234 -0
  212. aiecs/scripts/tools_develop/__init__.py +21 -0
  213. aiecs/scripts/tools_develop/check_type_annotations.py +259 -0
  214. aiecs/scripts/tools_develop/validate_tool_schemas.py +422 -0
  215. aiecs/scripts/tools_develop/verify_tools.py +356 -0
  216. aiecs/tasks/__init__.py +1 -0
  217. aiecs/tasks/worker.py +172 -0
  218. aiecs/tools/__init__.py +299 -0
  219. aiecs/tools/apisource/__init__.py +99 -0
  220. aiecs/tools/apisource/intelligence/__init__.py +19 -0
  221. aiecs/tools/apisource/intelligence/data_fusion.py +381 -0
  222. aiecs/tools/apisource/intelligence/query_analyzer.py +413 -0
  223. aiecs/tools/apisource/intelligence/search_enhancer.py +388 -0
  224. aiecs/tools/apisource/monitoring/__init__.py +9 -0
  225. aiecs/tools/apisource/monitoring/metrics.py +303 -0
  226. aiecs/tools/apisource/providers/__init__.py +115 -0
  227. aiecs/tools/apisource/providers/base.py +664 -0
  228. aiecs/tools/apisource/providers/census.py +401 -0
  229. aiecs/tools/apisource/providers/fred.py +564 -0
  230. aiecs/tools/apisource/providers/newsapi.py +412 -0
  231. aiecs/tools/apisource/providers/worldbank.py +357 -0
  232. aiecs/tools/apisource/reliability/__init__.py +12 -0
  233. aiecs/tools/apisource/reliability/error_handler.py +375 -0
  234. aiecs/tools/apisource/reliability/fallback_strategy.py +391 -0
  235. aiecs/tools/apisource/tool.py +850 -0
  236. aiecs/tools/apisource/utils/__init__.py +9 -0
  237. aiecs/tools/apisource/utils/validators.py +338 -0
  238. aiecs/tools/base_tool.py +201 -0
  239. aiecs/tools/docs/__init__.py +121 -0
  240. aiecs/tools/docs/ai_document_orchestrator.py +599 -0
  241. aiecs/tools/docs/ai_document_writer_orchestrator.py +2403 -0
  242. aiecs/tools/docs/content_insertion_tool.py +1333 -0
  243. aiecs/tools/docs/document_creator_tool.py +1317 -0
  244. aiecs/tools/docs/document_layout_tool.py +1166 -0
  245. aiecs/tools/docs/document_parser_tool.py +994 -0
  246. aiecs/tools/docs/document_writer_tool.py +1818 -0
  247. aiecs/tools/knowledge_graph/__init__.py +17 -0
  248. aiecs/tools/knowledge_graph/graph_reasoning_tool.py +734 -0
  249. aiecs/tools/knowledge_graph/graph_search_tool.py +923 -0
  250. aiecs/tools/knowledge_graph/kg_builder_tool.py +476 -0
  251. aiecs/tools/langchain_adapter.py +542 -0
  252. aiecs/tools/schema_generator.py +275 -0
  253. aiecs/tools/search_tool/__init__.py +100 -0
  254. aiecs/tools/search_tool/analyzers.py +589 -0
  255. aiecs/tools/search_tool/cache.py +260 -0
  256. aiecs/tools/search_tool/constants.py +128 -0
  257. aiecs/tools/search_tool/context.py +216 -0
  258. aiecs/tools/search_tool/core.py +749 -0
  259. aiecs/tools/search_tool/deduplicator.py +123 -0
  260. aiecs/tools/search_tool/error_handler.py +271 -0
  261. aiecs/tools/search_tool/metrics.py +371 -0
  262. aiecs/tools/search_tool/rate_limiter.py +178 -0
  263. aiecs/tools/search_tool/schemas.py +277 -0
  264. aiecs/tools/statistics/__init__.py +80 -0
  265. aiecs/tools/statistics/ai_data_analysis_orchestrator.py +643 -0
  266. aiecs/tools/statistics/ai_insight_generator_tool.py +505 -0
  267. aiecs/tools/statistics/ai_report_orchestrator_tool.py +694 -0
  268. aiecs/tools/statistics/data_loader_tool.py +564 -0
  269. aiecs/tools/statistics/data_profiler_tool.py +658 -0
  270. aiecs/tools/statistics/data_transformer_tool.py +573 -0
  271. aiecs/tools/statistics/data_visualizer_tool.py +495 -0
  272. aiecs/tools/statistics/model_trainer_tool.py +487 -0
  273. aiecs/tools/statistics/statistical_analyzer_tool.py +459 -0
  274. aiecs/tools/task_tools/__init__.py +86 -0
  275. aiecs/tools/task_tools/chart_tool.py +732 -0
  276. aiecs/tools/task_tools/classfire_tool.py +922 -0
  277. aiecs/tools/task_tools/image_tool.py +447 -0
  278. aiecs/tools/task_tools/office_tool.py +684 -0
  279. aiecs/tools/task_tools/pandas_tool.py +635 -0
  280. aiecs/tools/task_tools/report_tool.py +635 -0
  281. aiecs/tools/task_tools/research_tool.py +392 -0
  282. aiecs/tools/task_tools/scraper_tool.py +715 -0
  283. aiecs/tools/task_tools/stats_tool.py +688 -0
  284. aiecs/tools/temp_file_manager.py +130 -0
  285. aiecs/tools/tool_executor/__init__.py +37 -0
  286. aiecs/tools/tool_executor/tool_executor.py +881 -0
  287. aiecs/utils/LLM_output_structor.py +445 -0
  288. aiecs/utils/__init__.py +34 -0
  289. aiecs/utils/base_callback.py +47 -0
  290. aiecs/utils/cache_provider.py +695 -0
  291. aiecs/utils/execution_utils.py +184 -0
  292. aiecs/utils/logging.py +1 -0
  293. aiecs/utils/prompt_loader.py +14 -0
  294. aiecs/utils/token_usage_repository.py +323 -0
  295. aiecs/ws/__init__.py +0 -0
  296. aiecs/ws/socket_server.py +52 -0
  297. aiecs-1.5.1.dist-info/METADATA +608 -0
  298. aiecs-1.5.1.dist-info/RECORD +302 -0
  299. aiecs-1.5.1.dist-info/WHEEL +5 -0
  300. aiecs-1.5.1.dist-info/entry_points.txt +10 -0
  301. aiecs-1.5.1.dist-info/licenses/LICENSE +225 -0
  302. 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,7 @@
1
+ """
2
+ Knowledge Graph Application Layer
3
+
4
+ This module contains application services and use cases for knowledge graph operations.
5
+ """
6
+
7
+ __all__ = []
@@ -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
+ ]