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,444 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tool Agent
|
|
3
|
+
|
|
4
|
+
Agent implementation specialized in tool usage and execution.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import logging
|
|
8
|
+
from typing import Dict, List, Any, Optional, Union, TYPE_CHECKING
|
|
9
|
+
from datetime import datetime
|
|
10
|
+
|
|
11
|
+
from aiecs.tools import get_tool, BaseTool
|
|
12
|
+
|
|
13
|
+
from .base_agent import BaseAIAgent
|
|
14
|
+
from .models import AgentType, AgentConfiguration
|
|
15
|
+
from .exceptions import TaskExecutionError, ToolAccessDeniedError
|
|
16
|
+
|
|
17
|
+
if TYPE_CHECKING:
|
|
18
|
+
from aiecs.domain.agent.integration.protocols import (
|
|
19
|
+
ConfigManagerProtocol,
|
|
20
|
+
CheckpointerProtocol,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
logger = logging.getLogger(__name__)
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class ToolAgent(BaseAIAgent):
|
|
27
|
+
"""
|
|
28
|
+
Agent specialized in tool selection and execution.
|
|
29
|
+
|
|
30
|
+
This agent can execute one or more tools to complete tasks.
|
|
31
|
+
|
|
32
|
+
**Tool Configuration:**
|
|
33
|
+
- Tool names (List[str]): Backward compatible, tools loaded by name
|
|
34
|
+
- Tool instances (Dict[str, BaseTool]): Pre-configured tools with preserved state
|
|
35
|
+
|
|
36
|
+
Examples:
|
|
37
|
+
# Example 1: Basic usage with tool names (backward compatible)
|
|
38
|
+
agent = ToolAgent(
|
|
39
|
+
agent_id="agent1",
|
|
40
|
+
name="My Tool Agent",
|
|
41
|
+
tools=["search", "calculator"],
|
|
42
|
+
config=config
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# Example 2: Using tool instances with preserved state
|
|
46
|
+
from aiecs.tools import BaseTool
|
|
47
|
+
|
|
48
|
+
class StatefulCalculatorTool(BaseTool):
|
|
49
|
+
def __init__(self):
|
|
50
|
+
self.calculation_history = [] # State preserved
|
|
51
|
+
|
|
52
|
+
async def run_async(self, operation: str, a: float, b: float):
|
|
53
|
+
if operation == "add":
|
|
54
|
+
result = a + b
|
|
55
|
+
elif operation == "multiply":
|
|
56
|
+
result = a * b
|
|
57
|
+
else:
|
|
58
|
+
raise ValueError(f"Unknown operation: {operation}")
|
|
59
|
+
|
|
60
|
+
# Store in history
|
|
61
|
+
self.calculation_history.append({
|
|
62
|
+
"operation": operation,
|
|
63
|
+
"a": a,
|
|
64
|
+
"b": b,
|
|
65
|
+
"result": result
|
|
66
|
+
})
|
|
67
|
+
return result
|
|
68
|
+
|
|
69
|
+
# Create tool instance
|
|
70
|
+
calculator = StatefulCalculatorTool()
|
|
71
|
+
|
|
72
|
+
agent = ToolAgent(
|
|
73
|
+
agent_id="agent1",
|
|
74
|
+
name="My Tool Agent",
|
|
75
|
+
tools={
|
|
76
|
+
"calculator": calculator, # Stateful tool instance
|
|
77
|
+
"search": SearchTool(api_key="...")
|
|
78
|
+
},
|
|
79
|
+
config=config
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
# Execute task
|
|
83
|
+
result = await agent.execute_task({
|
|
84
|
+
"tool": "calculator",
|
|
85
|
+
"operation": "add",
|
|
86
|
+
"parameters": {"a": 5, "b": 3}
|
|
87
|
+
}, {})
|
|
88
|
+
|
|
89
|
+
# Tool state (calculation_history) is preserved
|
|
90
|
+
print(f"History: {calculator.calculation_history}")
|
|
91
|
+
|
|
92
|
+
# Example 3: Tool instances with dependencies
|
|
93
|
+
class ContextAwareSearchTool(BaseTool):
|
|
94
|
+
def __init__(self, api_key: str, context_engine):
|
|
95
|
+
self.api_key = api_key
|
|
96
|
+
self.context_engine = context_engine
|
|
97
|
+
self.search_cache = {} # State preserved
|
|
98
|
+
|
|
99
|
+
async def run_async(self, operation: str, query: str):
|
|
100
|
+
# Check cache first
|
|
101
|
+
if query in self.search_cache:
|
|
102
|
+
return self.search_cache[query]
|
|
103
|
+
|
|
104
|
+
# Use context_engine for context-aware search
|
|
105
|
+
results = await self._perform_search(query)
|
|
106
|
+
self.search_cache[query] = results
|
|
107
|
+
return results
|
|
108
|
+
|
|
109
|
+
context_engine = ContextEngine()
|
|
110
|
+
await context_engine.initialize()
|
|
111
|
+
|
|
112
|
+
search_tool = ContextAwareSearchTool(
|
|
113
|
+
api_key="...",
|
|
114
|
+
context_engine=context_engine
|
|
115
|
+
)
|
|
116
|
+
|
|
117
|
+
agent = ToolAgent(
|
|
118
|
+
agent_id="agent1",
|
|
119
|
+
name="My Tool Agent",
|
|
120
|
+
tools={
|
|
121
|
+
"search": search_tool, # Tool with dependencies
|
|
122
|
+
"calculator": CalculatorTool()
|
|
123
|
+
},
|
|
124
|
+
config=config
|
|
125
|
+
)
|
|
126
|
+
|
|
127
|
+
# Example 4: Full-featured agent with all options
|
|
128
|
+
from aiecs.domain.context import ContextEngine
|
|
129
|
+
from aiecs.domain.agent.models import ResourceLimits
|
|
130
|
+
|
|
131
|
+
context_engine = ContextEngine()
|
|
132
|
+
await context_engine.initialize()
|
|
133
|
+
|
|
134
|
+
resource_limits = ResourceLimits(
|
|
135
|
+
max_concurrent_tasks=5,
|
|
136
|
+
max_tool_calls_per_minute=100
|
|
137
|
+
)
|
|
138
|
+
|
|
139
|
+
agent = ToolAgent(
|
|
140
|
+
agent_id="agent1",
|
|
141
|
+
name="My Tool Agent",
|
|
142
|
+
tools={
|
|
143
|
+
"search": ContextAwareSearchTool(api_key="...", context_engine=context_engine),
|
|
144
|
+
"calculator": StatefulCalculatorTool()
|
|
145
|
+
},
|
|
146
|
+
config=config,
|
|
147
|
+
config_manager=DatabaseConfigManager(),
|
|
148
|
+
checkpointer=RedisCheckpointer(),
|
|
149
|
+
context_engine=context_engine,
|
|
150
|
+
collaboration_enabled=True,
|
|
151
|
+
agent_registry={"agent2": other_agent},
|
|
152
|
+
learning_enabled=True,
|
|
153
|
+
resource_limits=resource_limits
|
|
154
|
+
)
|
|
155
|
+
"""
|
|
156
|
+
|
|
157
|
+
def __init__(
|
|
158
|
+
self,
|
|
159
|
+
agent_id: str,
|
|
160
|
+
name: str,
|
|
161
|
+
tools: Union[List[str], Dict[str, BaseTool]],
|
|
162
|
+
config: AgentConfiguration,
|
|
163
|
+
description: Optional[str] = None,
|
|
164
|
+
version: str = "1.0.0",
|
|
165
|
+
config_manager: Optional["ConfigManagerProtocol"] = None,
|
|
166
|
+
checkpointer: Optional["CheckpointerProtocol"] = None,
|
|
167
|
+
context_engine: Optional[Any] = None,
|
|
168
|
+
collaboration_enabled: bool = False,
|
|
169
|
+
agent_registry: Optional[Dict[str, Any]] = None,
|
|
170
|
+
learning_enabled: bool = False,
|
|
171
|
+
resource_limits: Optional[Any] = None,
|
|
172
|
+
):
|
|
173
|
+
"""
|
|
174
|
+
Initialize Tool agent.
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
agent_id: Unique agent identifier
|
|
178
|
+
name: Agent name
|
|
179
|
+
tools: Tools - either list of tool names or dict of tool instances
|
|
180
|
+
config: Agent configuration
|
|
181
|
+
description: Optional description
|
|
182
|
+
version: Agent version
|
|
183
|
+
config_manager: Optional configuration manager for dynamic config
|
|
184
|
+
checkpointer: Optional checkpointer for state persistence
|
|
185
|
+
context_engine: Optional context engine for persistent storage
|
|
186
|
+
collaboration_enabled: Enable collaboration features
|
|
187
|
+
agent_registry: Registry of other agents for collaboration
|
|
188
|
+
learning_enabled: Enable learning features
|
|
189
|
+
resource_limits: Optional resource limits configuration
|
|
190
|
+
|
|
191
|
+
Example with tool instances:
|
|
192
|
+
```python
|
|
193
|
+
agent = ToolAgent(
|
|
194
|
+
agent_id="agent1",
|
|
195
|
+
name="My Tool Agent",
|
|
196
|
+
tools={
|
|
197
|
+
"search": SearchTool(api_key="..."),
|
|
198
|
+
"calculator": CalculatorTool()
|
|
199
|
+
},
|
|
200
|
+
config=config
|
|
201
|
+
)
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Example with tool names (backward compatible):
|
|
205
|
+
```python
|
|
206
|
+
agent = ToolAgent(
|
|
207
|
+
agent_id="agent1",
|
|
208
|
+
name="My Tool Agent",
|
|
209
|
+
tools=["search", "calculator"],
|
|
210
|
+
config=config
|
|
211
|
+
)
|
|
212
|
+
```
|
|
213
|
+
"""
|
|
214
|
+
super().__init__(
|
|
215
|
+
agent_id=agent_id,
|
|
216
|
+
name=name,
|
|
217
|
+
agent_type=AgentType.TASK_EXECUTOR,
|
|
218
|
+
config=config,
|
|
219
|
+
description=description or "Tool-based task execution agent",
|
|
220
|
+
version=version,
|
|
221
|
+
tools=tools,
|
|
222
|
+
config_manager=config_manager,
|
|
223
|
+
checkpointer=checkpointer,
|
|
224
|
+
context_engine=context_engine,
|
|
225
|
+
collaboration_enabled=collaboration_enabled,
|
|
226
|
+
agent_registry=agent_registry,
|
|
227
|
+
learning_enabled=learning_enabled,
|
|
228
|
+
resource_limits=resource_limits,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
self._tool_instances: Dict[str, BaseTool] = {}
|
|
232
|
+
self._tool_usage_stats: Dict[str, Dict[str, int]] = {}
|
|
233
|
+
|
|
234
|
+
tool_count = len(tools) if isinstance(tools, (list, dict)) else 0
|
|
235
|
+
logger.info(f"ToolAgent initialized: {agent_id} with {tool_count} tools")
|
|
236
|
+
|
|
237
|
+
async def _initialize(self) -> None:
|
|
238
|
+
"""Initialize Tool agent - load tools using BaseAIAgent helper."""
|
|
239
|
+
# Load tools using BaseAIAgent helper
|
|
240
|
+
self._load_tools()
|
|
241
|
+
|
|
242
|
+
# Get tool instances from BaseAIAgent (if provided as instances)
|
|
243
|
+
base_tool_instances = self._get_tool_instances()
|
|
244
|
+
|
|
245
|
+
if base_tool_instances:
|
|
246
|
+
# Tool instances were provided - use them directly
|
|
247
|
+
self._tool_instances = base_tool_instances
|
|
248
|
+
logger.info(f"ToolAgent {self.agent_id} using " f"{len(self._tool_instances)} pre-configured tool instances")
|
|
249
|
+
elif self._available_tools:
|
|
250
|
+
# Tool names were provided - load them
|
|
251
|
+
for tool_name in self._available_tools:
|
|
252
|
+
try:
|
|
253
|
+
self._tool_instances[tool_name] = get_tool(tool_name)
|
|
254
|
+
logger.debug(f"ToolAgent {self.agent_id} loaded tool: {tool_name}")
|
|
255
|
+
except Exception as e:
|
|
256
|
+
logger.warning(f"Failed to load tool {tool_name}: {e}")
|
|
257
|
+
|
|
258
|
+
logger.info(f"ToolAgent {self.agent_id} initialized with {len(self._tool_instances)} tools")
|
|
259
|
+
|
|
260
|
+
# Initialize usage stats for all tools
|
|
261
|
+
for tool_name in self._tool_instances.keys():
|
|
262
|
+
self._tool_usage_stats[tool_name] = {
|
|
263
|
+
"success_count": 0,
|
|
264
|
+
"failure_count": 0,
|
|
265
|
+
"total_count": 0,
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
async def _shutdown(self) -> None:
|
|
269
|
+
"""Shutdown Tool agent."""
|
|
270
|
+
self._tool_instances.clear()
|
|
271
|
+
logger.info(f"ToolAgent {self.agent_id} shut down")
|
|
272
|
+
|
|
273
|
+
async def execute_task(self, task: Dict[str, Any], context: Dict[str, Any]) -> Dict[str, Any]:
|
|
274
|
+
"""
|
|
275
|
+
Execute a task using tools.
|
|
276
|
+
|
|
277
|
+
Args:
|
|
278
|
+
task: Task specification with 'tool', 'operation', and 'parameters'
|
|
279
|
+
context: Execution context
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Execution result with 'output', 'tool_used', 'execution_time'
|
|
283
|
+
|
|
284
|
+
Raises:
|
|
285
|
+
TaskExecutionError: If task execution fails
|
|
286
|
+
"""
|
|
287
|
+
start_time = datetime.utcnow()
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
# Extract tool and operation
|
|
291
|
+
tool_name = task.get("tool")
|
|
292
|
+
operation = task.get("operation")
|
|
293
|
+
parameters = task.get("parameters", {})
|
|
294
|
+
|
|
295
|
+
if not tool_name:
|
|
296
|
+
raise TaskExecutionError("Task must contain 'tool' field", agent_id=self.agent_id)
|
|
297
|
+
|
|
298
|
+
# Check tool access
|
|
299
|
+
if not self._available_tools or tool_name not in self._available_tools:
|
|
300
|
+
raise ToolAccessDeniedError(self.agent_id, tool_name)
|
|
301
|
+
|
|
302
|
+
# Transition to busy state
|
|
303
|
+
self._transition_state(self.state.__class__.BUSY)
|
|
304
|
+
self._current_task_id = task.get("task_id")
|
|
305
|
+
|
|
306
|
+
# Execute tool
|
|
307
|
+
result = await self._execute_tool(tool_name, operation, parameters)
|
|
308
|
+
|
|
309
|
+
# Calculate execution time
|
|
310
|
+
execution_time = (datetime.utcnow() - start_time).total_seconds()
|
|
311
|
+
|
|
312
|
+
# Update metrics
|
|
313
|
+
self.update_metrics(
|
|
314
|
+
execution_time=execution_time,
|
|
315
|
+
success=True,
|
|
316
|
+
tool_calls=1,
|
|
317
|
+
)
|
|
318
|
+
|
|
319
|
+
# Update tool usage stats
|
|
320
|
+
self._update_tool_stats(tool_name, success=True)
|
|
321
|
+
|
|
322
|
+
# Transition back to active
|
|
323
|
+
self._transition_state(self.state.__class__.ACTIVE)
|
|
324
|
+
self._current_task_id = None
|
|
325
|
+
self.last_active_at = datetime.utcnow()
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
"success": True,
|
|
329
|
+
"output": result,
|
|
330
|
+
"tool_used": tool_name,
|
|
331
|
+
"operation": operation,
|
|
332
|
+
"execution_time": execution_time,
|
|
333
|
+
"timestamp": datetime.utcnow().isoformat(),
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
except Exception as e:
|
|
337
|
+
logger.error(f"Task execution failed for {self.agent_id}: {e}")
|
|
338
|
+
|
|
339
|
+
# Update metrics for failure
|
|
340
|
+
execution_time = (datetime.utcnow() - start_time).total_seconds()
|
|
341
|
+
self.update_metrics(execution_time=execution_time, success=False)
|
|
342
|
+
|
|
343
|
+
# Update tool stats if tool was specified
|
|
344
|
+
if tool_name:
|
|
345
|
+
self._update_tool_stats(tool_name, success=False)
|
|
346
|
+
|
|
347
|
+
# Transition to error state
|
|
348
|
+
self._transition_state(self.state.__class__.ERROR)
|
|
349
|
+
self._current_task_id = None
|
|
350
|
+
|
|
351
|
+
raise TaskExecutionError(
|
|
352
|
+
f"Task execution failed: {str(e)}",
|
|
353
|
+
agent_id=self.agent_id,
|
|
354
|
+
task_id=task.get("task_id"),
|
|
355
|
+
)
|
|
356
|
+
|
|
357
|
+
async def process_message(self, message: str, sender_id: Optional[str] = None) -> Dict[str, Any]:
|
|
358
|
+
"""
|
|
359
|
+
Process an incoming message.
|
|
360
|
+
|
|
361
|
+
For ToolAgent, this is limited - it's designed for direct tool execution.
|
|
362
|
+
|
|
363
|
+
Args:
|
|
364
|
+
message: Message content
|
|
365
|
+
sender_id: Optional sender identifier
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
Response dictionary
|
|
369
|
+
"""
|
|
370
|
+
available_tools_str = ", ".join(self._available_tools) if self._available_tools else "none"
|
|
371
|
+
return {
|
|
372
|
+
"response": (f"ToolAgent {self.name} received message but requires explicit tool tasks. " f"Available tools: {available_tools_str}"),
|
|
373
|
+
"available_tools": self._available_tools or [],
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
async def _execute_tool(
|
|
377
|
+
self,
|
|
378
|
+
tool_name: str,
|
|
379
|
+
operation: Optional[str],
|
|
380
|
+
parameters: Dict[str, Any],
|
|
381
|
+
) -> Any:
|
|
382
|
+
"""
|
|
383
|
+
Execute a tool operation.
|
|
384
|
+
|
|
385
|
+
Args:
|
|
386
|
+
tool_name: Tool name
|
|
387
|
+
operation: Operation name (optional for tools with single operation)
|
|
388
|
+
parameters: Operation parameters
|
|
389
|
+
|
|
390
|
+
Returns:
|
|
391
|
+
Tool execution result
|
|
392
|
+
"""
|
|
393
|
+
tool = self._tool_instances.get(tool_name)
|
|
394
|
+
if not tool:
|
|
395
|
+
raise ValueError(f"Tool {tool_name} not loaded")
|
|
396
|
+
|
|
397
|
+
# Execute tool
|
|
398
|
+
if operation:
|
|
399
|
+
result = await tool.run_async(operation, **parameters)
|
|
400
|
+
else:
|
|
401
|
+
# If no operation specified, try to call the tool directly
|
|
402
|
+
if hasattr(tool, "run_async"):
|
|
403
|
+
result = await tool.run_async(**parameters)
|
|
404
|
+
else:
|
|
405
|
+
raise ValueError(f"Tool {tool_name} requires operation to be specified")
|
|
406
|
+
|
|
407
|
+
return result
|
|
408
|
+
|
|
409
|
+
def _update_tool_stats(self, tool_name: str, success: bool) -> None:
|
|
410
|
+
"""Update tool usage statistics."""
|
|
411
|
+
if tool_name not in self._tool_usage_stats:
|
|
412
|
+
self._tool_usage_stats[tool_name] = {
|
|
413
|
+
"success_count": 0,
|
|
414
|
+
"failure_count": 0,
|
|
415
|
+
"total_count": 0,
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
stats = self._tool_usage_stats[tool_name]
|
|
419
|
+
stats["total_count"] += 1
|
|
420
|
+
if success:
|
|
421
|
+
stats["success_count"] += 1
|
|
422
|
+
else:
|
|
423
|
+
stats["failure_count"] += 1
|
|
424
|
+
|
|
425
|
+
def get_tool_stats(self) -> Dict[str, Dict[str, int]]:
|
|
426
|
+
"""Get tool usage statistics."""
|
|
427
|
+
return self._tool_usage_stats.copy()
|
|
428
|
+
|
|
429
|
+
def get_available_tools(self) -> List[str]:
|
|
430
|
+
"""Get list of available tools."""
|
|
431
|
+
return self._available_tools.copy() if self._available_tools else []
|
|
432
|
+
|
|
433
|
+
@classmethod
|
|
434
|
+
def from_dict(cls, data: Dict[str, Any]) -> "ToolAgent":
|
|
435
|
+
"""
|
|
436
|
+
Deserialize ToolAgent from dictionary.
|
|
437
|
+
|
|
438
|
+
Args:
|
|
439
|
+
data: Dictionary representation
|
|
440
|
+
|
|
441
|
+
Returns:
|
|
442
|
+
ToolAgent instance
|
|
443
|
+
"""
|
|
444
|
+
raise NotImplementedError("ToolAgent.from_dict not fully implemented yet")
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tool Integration
|
|
3
|
+
|
|
4
|
+
Tool schema generation and integration with AIECS tools.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .schema_generator import (
|
|
8
|
+
ToolSchemaGenerator,
|
|
9
|
+
generate_tool_schema,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
__all__ = [
|
|
13
|
+
"ToolSchemaGenerator",
|
|
14
|
+
"generate_tool_schema",
|
|
15
|
+
]
|