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,234 @@
|
|
|
1
|
+
# 工具自动发现机制
|
|
2
|
+
|
|
3
|
+
## 📋 概述
|
|
4
|
+
|
|
5
|
+
从现在开始,**无需手动维护工具列表**!系统会自动发现所有使用 `@register_tool` 装饰器注册的工具。
|
|
6
|
+
|
|
7
|
+
## ✨ 特性
|
|
8
|
+
|
|
9
|
+
### 1. 自动工具发现
|
|
10
|
+
- ✅ 自动扫描 `aiecs/tools/task_tools/`、`aiecs/tools/docs/`、`aiecs/tools/statistics/` 目录
|
|
11
|
+
- ✅ 自动识别所有 `@register_tool` 装饰器
|
|
12
|
+
- ✅ 自动提取工具名称和描述
|
|
13
|
+
- ✅ 自动分类(task/docs/statistics)
|
|
14
|
+
|
|
15
|
+
### 2. 零维护成本
|
|
16
|
+
- ✅ 添加新工具:只需在工具类上添加 `@register_tool("tool_name")` 装饰器
|
|
17
|
+
- ✅ 删除工具:直接删除文件或移除装饰器
|
|
18
|
+
- ✅ 重命名工具:修改装饰器参数即可
|
|
19
|
+
- ✅ 无需修改任何配置文件
|
|
20
|
+
|
|
21
|
+
## 🔧 工作原理
|
|
22
|
+
|
|
23
|
+
### aiecs/tools/__init__.py
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
def _auto_discover_tools():
|
|
27
|
+
"""自动发现所有工具"""
|
|
28
|
+
# 扫描工具目录
|
|
29
|
+
for dir_name, category in [('task_tools', 'task'), ('docs', 'docs'), ('statistics', 'statistics')]:
|
|
30
|
+
# 查找所有 Python 文件
|
|
31
|
+
for filename in os.listdir(dir_path):
|
|
32
|
+
# 读取文件内容
|
|
33
|
+
# 使用正则表达式查找 @register_tool 装饰器
|
|
34
|
+
pattern = r'@register_tool\([\'"]([^\'"]+)[\'"]\)'
|
|
35
|
+
matches = re.findall(pattern, content)
|
|
36
|
+
# 提取工具名称和描述
|
|
37
|
+
# 注册为占位符,等待懒加载
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### verify_tools.py
|
|
41
|
+
|
|
42
|
+
```python
|
|
43
|
+
def auto_discover_tool_modules():
|
|
44
|
+
"""自动发现工具模块映射"""
|
|
45
|
+
# 扫描工具目录
|
|
46
|
+
# 查找 @register_tool 装饰器
|
|
47
|
+
# 建立工具名称到模块路径的映射
|
|
48
|
+
# 返回映射表供动态加载使用
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## 📝 如何添加新工具
|
|
52
|
+
|
|
53
|
+
### 步骤 1: 创建工具文件
|
|
54
|
+
|
|
55
|
+
在合适的目录创建工具文件(例如:`aiecs/tools/task_tools/my_new_tool.py`)
|
|
56
|
+
|
|
57
|
+
### 步骤 2: 添加装饰器
|
|
58
|
+
|
|
59
|
+
```python
|
|
60
|
+
from aiecs.tools import register_tool
|
|
61
|
+
from aiecs.tools.base_tool import BaseTool
|
|
62
|
+
|
|
63
|
+
@register_tool("my_new_tool")
|
|
64
|
+
class MyNewTool(BaseTool):
|
|
65
|
+
"""
|
|
66
|
+
这是一个新工具的简短描述。
|
|
67
|
+
|
|
68
|
+
这个描述会被自动提取并显示在工具列表中。
|
|
69
|
+
"""
|
|
70
|
+
|
|
71
|
+
def my_method(self, param: str) -> str:
|
|
72
|
+
"""执行某个操作"""
|
|
73
|
+
return f"Result: {param}"
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
### 步骤 3: 验证
|
|
77
|
+
|
|
78
|
+
运行验证脚本查看新工具是否被发现:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
poetry run python -m aiecs.scripts.tools_develop.verify_tools
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
就这样!**无需修改任何其他文件**!
|
|
85
|
+
|
|
86
|
+
## 🎯 支持的目录结构
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
aiecs/tools/
|
|
90
|
+
├── task_tools/ # 任务工具 (category: task)
|
|
91
|
+
│ ├── chart_tool.py # @register_tool("chart")
|
|
92
|
+
│ ├── pandas_tool.py # @register_tool("pandas")
|
|
93
|
+
│ └── ...
|
|
94
|
+
├── docs/ # 文档工具 (category: docs)
|
|
95
|
+
│ ├── document_parser_tool.py # @register_tool("document_parser")
|
|
96
|
+
│ ├── document_writer_tool.py # @register_tool("document_writer")
|
|
97
|
+
│ └── ...
|
|
98
|
+
└── statistics/ # 统计工具 (category: statistics)
|
|
99
|
+
├── data_loader_tool.py # @register_tool("data_loader")
|
|
100
|
+
├── data_profiler_tool.py # @register_tool("data_profiler")
|
|
101
|
+
└── ...
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
## 🔍 描述提取规则
|
|
105
|
+
|
|
106
|
+
系统会自动提取类文档字符串的**第一行**作为工具描述:
|
|
107
|
+
|
|
108
|
+
```python
|
|
109
|
+
@register_tool("example")
|
|
110
|
+
class ExampleTool(BaseTool):
|
|
111
|
+
"""
|
|
112
|
+
这一行会被用作工具描述 ✅
|
|
113
|
+
|
|
114
|
+
下面的内容不会被提取。
|
|
115
|
+
可以写详细的文档说明。
|
|
116
|
+
"""
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
**建议**:
|
|
120
|
+
- 第一行保持简短(< 200 字符)
|
|
121
|
+
- 清晰描述工具的主要功能
|
|
122
|
+
- 避免使用多行描述
|
|
123
|
+
|
|
124
|
+
## 📊 当前发现的工具统计
|
|
125
|
+
|
|
126
|
+
截至最后扫描,系统发现了 **26 个工具**:
|
|
127
|
+
|
|
128
|
+
- **任务工具** (10个):chart, classifier, image, office, pandas, report, research, scraper, search, stats
|
|
129
|
+
- **文档工具** (7个):document_parser, document_writer, document_creator, document_layout, content_insertion, ai_document_orchestrator, ai_document_writer_orchestrator
|
|
130
|
+
- **数据统计工具** (9个):data_loader, data_profiler, data_transformer, data_visualizer, model_trainer, statistical_analyzer, ai_data_analysis_orchestrator, ai_insight_generator, ai_report_orchestrator
|
|
131
|
+
|
|
132
|
+
## ⚡ 性能优化
|
|
133
|
+
|
|
134
|
+
### 占位符机制
|
|
135
|
+
- 工具发现时创建轻量级占位符
|
|
136
|
+
- 不导入实际工具模块(避免重依赖)
|
|
137
|
+
- 只在实际使用时才加载工具
|
|
138
|
+
|
|
139
|
+
### 懒加载
|
|
140
|
+
- `verify_tools.py` 只在用户选择工具时才加载模块
|
|
141
|
+
- 避免启动时加载所有工具
|
|
142
|
+
- 提高响应速度
|
|
143
|
+
|
|
144
|
+
## 🧪 测试验证
|
|
145
|
+
|
|
146
|
+
### 验证工具发现
|
|
147
|
+
```bash
|
|
148
|
+
poetry run python -m aiecs.scripts.tools_develop.verify_tools
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
### 验证特定工具
|
|
152
|
+
在交互模式中输入工具名称或序号:
|
|
153
|
+
```
|
|
154
|
+
👉 请选择工具 > pandas
|
|
155
|
+
👉 请选择工具 > 7
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 验证描述提取
|
|
159
|
+
检查工具列表中的描述是否正确提取自类文档字符串。
|
|
160
|
+
|
|
161
|
+
## 🔄 兼容性
|
|
162
|
+
|
|
163
|
+
### 向后兼容
|
|
164
|
+
- 现有工具无需修改
|
|
165
|
+
- 只要有 `@register_tool` 装饰器即可被发现
|
|
166
|
+
- 保持与现有代码的兼容性
|
|
167
|
+
|
|
168
|
+
### 新增目录支持
|
|
169
|
+
如果未来需要添加新的工具目录(如 `aiecs/tools/ml_tools/`),只需修改两处:
|
|
170
|
+
|
|
171
|
+
1. **aiecs/tools/__init__.py**
|
|
172
|
+
```python
|
|
173
|
+
tool_dirs = [
|
|
174
|
+
('task_tools', 'task'),
|
|
175
|
+
('docs', 'docs'),
|
|
176
|
+
('statistics', 'statistics'),
|
|
177
|
+
('ml_tools', 'ml'), # 新增
|
|
178
|
+
]
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
2. **verify_tools.py**
|
|
182
|
+
```python
|
|
183
|
+
tool_dirs = {
|
|
184
|
+
'task_tools': 'aiecs.tools.task_tools',
|
|
185
|
+
'docs': 'aiecs.tools.docs',
|
|
186
|
+
'statistics': 'aiecs.tools.statistics',
|
|
187
|
+
'ml_tools': 'aiecs.tools.ml_tools', # 新增
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
## ❓ 常见问题
|
|
192
|
+
|
|
193
|
+
### Q: 工具没有被发现?
|
|
194
|
+
**A:** 检查以下几点:
|
|
195
|
+
1. 文件是否在支持的目录中(task_tools/docs/statistics)
|
|
196
|
+
2. 是否使用了 `@register_tool("name")` 装饰器
|
|
197
|
+
3. 文件名是否以 `.py` 结尾且不是 `__init__.py`
|
|
198
|
+
|
|
199
|
+
### Q: 描述显示不正确?
|
|
200
|
+
**A:** 检查类文档字符串:
|
|
201
|
+
1. 文档字符串必须紧跟类定义
|
|
202
|
+
2. 使用三引号 `"""`
|
|
203
|
+
3. 确保第一行是简短描述
|
|
204
|
+
|
|
205
|
+
### Q: 如何重命名工具?
|
|
206
|
+
**A:** 只需修改装饰器参数:
|
|
207
|
+
```python
|
|
208
|
+
# 旧
|
|
209
|
+
@register_tool("old_name")
|
|
210
|
+
|
|
211
|
+
# 新
|
|
212
|
+
@register_tool("new_name")
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Q: 如何临时禁用工具?
|
|
216
|
+
**A:** 两种方法:
|
|
217
|
+
1. 注释掉 `@register_tool` 装饰器
|
|
218
|
+
2. 移动文件到其他目录
|
|
219
|
+
|
|
220
|
+
## 🎉 优势总结
|
|
221
|
+
|
|
222
|
+
| 特性 | 手动维护 | 自动发现 |
|
|
223
|
+
|------|---------|---------|
|
|
224
|
+
| 添加工具 | 需修改配置文件 | 只需添加装饰器 ✅ |
|
|
225
|
+
| 删除工具 | 需修改配置文件 | 直接删除文件 ✅ |
|
|
226
|
+
| 维护成本 | 高 | 零 ✅ |
|
|
227
|
+
| 出错风险 | 容易遗漏 | 自动同步 ✅ |
|
|
228
|
+
| 描述准确性 | 可能不一致 | 直接提取 ✅ |
|
|
229
|
+
|
|
230
|
+
---
|
|
231
|
+
|
|
232
|
+
**维护者**: AIECS Tools Team
|
|
233
|
+
**最后更新**: 2025-10-14
|
|
234
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"""
|
|
2
|
+
工具开发辅助脚本
|
|
3
|
+
|
|
4
|
+
提供工具开发和维护所需的验证和检查功能。
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .check_type_annotations import (
|
|
8
|
+
check_annotations,
|
|
9
|
+
main as check_annotations_main,
|
|
10
|
+
)
|
|
11
|
+
from .validate_tool_schemas import (
|
|
12
|
+
validate_schemas,
|
|
13
|
+
main as validate_schemas_main,
|
|
14
|
+
)
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"check_annotations",
|
|
18
|
+
"check_annotations_main",
|
|
19
|
+
"validate_schemas",
|
|
20
|
+
"validate_schemas_main",
|
|
21
|
+
]
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
工具类型注解检查器
|
|
4
|
+
|
|
5
|
+
用于工具开发和维护,检查工具方法的类型注解完整性。
|
|
6
|
+
帮助开发者确保工具方法有完整的类型注解,为自动 Schema 生成提供基础。
|
|
7
|
+
|
|
8
|
+
使用方法:
|
|
9
|
+
# 检查所有工具
|
|
10
|
+
aiecs tools check-annotations
|
|
11
|
+
|
|
12
|
+
# 检查特定工具
|
|
13
|
+
aiecs tools check-annotations pandas
|
|
14
|
+
|
|
15
|
+
# 检查多个工具
|
|
16
|
+
aiecs tools check-annotations pandas chart image
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from aiecs.tools import discover_tools, TOOL_CLASSES
|
|
20
|
+
import sys
|
|
21
|
+
import inspect
|
|
22
|
+
from typing import get_type_hints, Optional, List, Dict
|
|
23
|
+
|
|
24
|
+
# 确保可以导入 aiecs
|
|
25
|
+
import os
|
|
26
|
+
|
|
27
|
+
sys.path.insert(
|
|
28
|
+
0,
|
|
29
|
+
os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))),
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def check_method_type_annotations(method, method_name):
|
|
34
|
+
"""
|
|
35
|
+
检查方法的类型注解完整性
|
|
36
|
+
|
|
37
|
+
Returns:
|
|
38
|
+
dict: {
|
|
39
|
+
'has_annotations': bool,
|
|
40
|
+
'complete': bool,
|
|
41
|
+
'params_with_types': list,
|
|
42
|
+
'params_without_types': list,
|
|
43
|
+
'has_return_type': bool,
|
|
44
|
+
'suggestions': list # 改进建议
|
|
45
|
+
}
|
|
46
|
+
"""
|
|
47
|
+
try:
|
|
48
|
+
sig = inspect.signature(method)
|
|
49
|
+
type_hints = get_type_hints(method)
|
|
50
|
+
except Exception:
|
|
51
|
+
return {
|
|
52
|
+
"has_annotations": False,
|
|
53
|
+
"complete": False,
|
|
54
|
+
"params_with_types": [],
|
|
55
|
+
"params_without_types": [],
|
|
56
|
+
"has_return_type": False,
|
|
57
|
+
"error": True,
|
|
58
|
+
"suggestions": ["无法获取类型信息,请检查方法定义"],
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
params_with_types = []
|
|
62
|
+
params_without_types = []
|
|
63
|
+
suggestions = []
|
|
64
|
+
|
|
65
|
+
for param_name, param in sig.parameters.items():
|
|
66
|
+
if param_name == "self":
|
|
67
|
+
continue
|
|
68
|
+
|
|
69
|
+
if param_name in type_hints:
|
|
70
|
+
params_with_types.append(param_name)
|
|
71
|
+
else:
|
|
72
|
+
params_without_types.append(param_name)
|
|
73
|
+
suggestions.append(f"为参数 '{param_name}' 添加类型注解")
|
|
74
|
+
|
|
75
|
+
has_return_type = "return" in type_hints
|
|
76
|
+
if not has_return_type:
|
|
77
|
+
suggestions.append("添加返回类型注解")
|
|
78
|
+
|
|
79
|
+
has_any_annotations = len(params_with_types) > 0 or has_return_type
|
|
80
|
+
is_complete = len(params_without_types) == 0 and has_return_type
|
|
81
|
+
|
|
82
|
+
return {
|
|
83
|
+
"has_annotations": has_any_annotations,
|
|
84
|
+
"complete": is_complete,
|
|
85
|
+
"params_with_types": params_with_types,
|
|
86
|
+
"params_without_types": params_without_types,
|
|
87
|
+
"has_return_type": has_return_type,
|
|
88
|
+
"error": False,
|
|
89
|
+
"suggestions": suggestions,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
def analyze_tool(tool_name, tool_class):
|
|
94
|
+
"""分析单个工具的类型注解情况"""
|
|
95
|
+
methods_info = []
|
|
96
|
+
|
|
97
|
+
for method_name in dir(tool_class):
|
|
98
|
+
# 跳过私有方法和特殊方法
|
|
99
|
+
if method_name.startswith("_"):
|
|
100
|
+
continue
|
|
101
|
+
|
|
102
|
+
# 跳过基类方法
|
|
103
|
+
if method_name in ["run", "run_async", "run_batch"]:
|
|
104
|
+
continue
|
|
105
|
+
|
|
106
|
+
method = getattr(tool_class, method_name)
|
|
107
|
+
|
|
108
|
+
# 跳过非方法属性
|
|
109
|
+
if not callable(method):
|
|
110
|
+
continue
|
|
111
|
+
|
|
112
|
+
# 跳过类(如 Config, Schema 等)
|
|
113
|
+
if isinstance(method, type):
|
|
114
|
+
continue
|
|
115
|
+
|
|
116
|
+
# 检查类型注解
|
|
117
|
+
annotation_info = check_method_type_annotations(method, method_name)
|
|
118
|
+
annotation_info["method_name"] = method_name
|
|
119
|
+
|
|
120
|
+
methods_info.append(annotation_info)
|
|
121
|
+
|
|
122
|
+
return methods_info
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
def print_tool_report(tool_name: str, methods_info: List[Dict], verbose: bool = False):
|
|
126
|
+
"""打印单个工具的报告"""
|
|
127
|
+
|
|
128
|
+
total = len(methods_info)
|
|
129
|
+
complete = sum(1 for m in methods_info if m["complete"])
|
|
130
|
+
sum(1 for m in methods_info if m["has_annotations"] and not m["complete"])
|
|
131
|
+
sum(1 for m in methods_info if not m["has_annotations"])
|
|
132
|
+
|
|
133
|
+
# 计算覆盖率
|
|
134
|
+
coverage = (complete / total * 100) if total > 0 else 0
|
|
135
|
+
|
|
136
|
+
# 状态图标
|
|
137
|
+
if coverage == 100:
|
|
138
|
+
status = "✅"
|
|
139
|
+
elif coverage >= 80:
|
|
140
|
+
status = "⚠️"
|
|
141
|
+
else:
|
|
142
|
+
status = "❌"
|
|
143
|
+
|
|
144
|
+
print(f"\n{status} {tool_name}: {complete}/{total} 方法有完整类型注解 ({coverage:.1f}%)")
|
|
145
|
+
|
|
146
|
+
if verbose or coverage < 100:
|
|
147
|
+
# 显示不完整的方法
|
|
148
|
+
incomplete = [m for m in methods_info if not m["complete"]]
|
|
149
|
+
if incomplete:
|
|
150
|
+
print("\n 需要改进的方法:")
|
|
151
|
+
for method_info in incomplete:
|
|
152
|
+
method_name = method_info["method_name"]
|
|
153
|
+
suggestions = method_info.get("suggestions", [])
|
|
154
|
+
|
|
155
|
+
if method_info["error"]:
|
|
156
|
+
print(f" ✗ {method_name}: 无法获取类型信息")
|
|
157
|
+
elif not method_info["has_annotations"]:
|
|
158
|
+
print(f" ✗ {method_name}: 无类型注解")
|
|
159
|
+
else:
|
|
160
|
+
print(f" ⚠ {method_name}: 部分类型注解")
|
|
161
|
+
|
|
162
|
+
# 显示改进建议
|
|
163
|
+
if suggestions and verbose:
|
|
164
|
+
for suggestion in suggestions:
|
|
165
|
+
print(f" → {suggestion}")
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def check_annotations(tool_names: Optional[List[str]] = None, verbose: bool = False):
|
|
169
|
+
"""
|
|
170
|
+
检查工具的类型注解
|
|
171
|
+
|
|
172
|
+
Args:
|
|
173
|
+
tool_names: 要检查的工具名称列表,None 表示检查所有工具
|
|
174
|
+
verbose: 是否显示详细信息
|
|
175
|
+
"""
|
|
176
|
+
print("=" * 100)
|
|
177
|
+
print("工具类型注解检查器")
|
|
178
|
+
print("=" * 100)
|
|
179
|
+
|
|
180
|
+
discover_tools()
|
|
181
|
+
|
|
182
|
+
# 确定要检查的工具
|
|
183
|
+
if tool_names:
|
|
184
|
+
tools_to_check = {}
|
|
185
|
+
for name in tool_names:
|
|
186
|
+
if name in TOOL_CLASSES:
|
|
187
|
+
tools_to_check[name] = TOOL_CLASSES[name]
|
|
188
|
+
else:
|
|
189
|
+
print(f"\n❌ 工具 '{name}' 不存在")
|
|
190
|
+
|
|
191
|
+
if not tools_to_check:
|
|
192
|
+
print("\n没有找到要检查的工具")
|
|
193
|
+
return
|
|
194
|
+
else:
|
|
195
|
+
tools_to_check = TOOL_CLASSES
|
|
196
|
+
|
|
197
|
+
# 检查每个工具
|
|
198
|
+
all_stats = []
|
|
199
|
+
for tool_name in sorted(tools_to_check.keys()):
|
|
200
|
+
tool_class = tools_to_check[tool_name]
|
|
201
|
+
methods_info = analyze_tool(tool_name, tool_class)
|
|
202
|
+
|
|
203
|
+
if methods_info:
|
|
204
|
+
print_tool_report(tool_name, methods_info, verbose)
|
|
205
|
+
|
|
206
|
+
total = len(methods_info)
|
|
207
|
+
complete = sum(1 for m in methods_info if m["complete"])
|
|
208
|
+
all_stats.append((tool_name, total, complete))
|
|
209
|
+
|
|
210
|
+
# 总体统计
|
|
211
|
+
if len(all_stats) > 1:
|
|
212
|
+
total_methods = sum(s[1] for s in all_stats)
|
|
213
|
+
total_complete = sum(s[2] for s in all_stats)
|
|
214
|
+
overall_coverage = (total_complete / total_methods * 100) if total_methods > 0 else 0
|
|
215
|
+
|
|
216
|
+
print("\n" + "=" * 100)
|
|
217
|
+
print(
|
|
218
|
+
f"总体统计: {total_complete}/{total_methods} 方法有完整类型注解 ({overall_coverage:.1f}%)"
|
|
219
|
+
)
|
|
220
|
+
print("=" * 100)
|
|
221
|
+
|
|
222
|
+
print("\n💡 提示:")
|
|
223
|
+
print(" - 完整类型注解包括:所有参数的类型 + 返回类型")
|
|
224
|
+
print(" - 使用 --verbose 查看详细的改进建议")
|
|
225
|
+
print(" - 完整的类型注解是自动 Schema 生成的基础")
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def main():
|
|
229
|
+
"""命令行入口"""
|
|
230
|
+
import argparse
|
|
231
|
+
|
|
232
|
+
parser = argparse.ArgumentParser(
|
|
233
|
+
description="检查工具方法的类型注解完整性",
|
|
234
|
+
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
235
|
+
epilog="""
|
|
236
|
+
示例:
|
|
237
|
+
# 检查所有工具
|
|
238
|
+
aiecs tools check-annotations
|
|
239
|
+
|
|
240
|
+
# 检查特定工具
|
|
241
|
+
aiecs tools check-annotations pandas
|
|
242
|
+
|
|
243
|
+
# 检查多个工具并显示详细信息
|
|
244
|
+
aiecs tools check-annotations pandas chart --verbose
|
|
245
|
+
""",
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
parser.add_argument("tools", nargs="*", help="要检查的工具名称(不指定则检查所有工具)")
|
|
249
|
+
|
|
250
|
+
parser.add_argument("-v", "--verbose", action="store_true", help="显示详细的改进建议")
|
|
251
|
+
|
|
252
|
+
args = parser.parse_args()
|
|
253
|
+
|
|
254
|
+
tool_names = args.tools if args.tools else None
|
|
255
|
+
check_annotations(tool_names, args.verbose)
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
if __name__ == "__main__":
|
|
259
|
+
main()
|