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,275 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Automatic Schema Generation Tool
|
|
3
|
+
|
|
4
|
+
Automatically generate Pydantic Schema from method signatures and type annotations
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import inspect
|
|
8
|
+
import logging
|
|
9
|
+
from typing import Any, Dict, Optional, Type, get_type_hints
|
|
10
|
+
from pydantic import BaseModel, Field, create_model, ConfigDict
|
|
11
|
+
|
|
12
|
+
logger = logging.getLogger(__name__)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def _normalize_type(param_type: Type) -> Type:
|
|
16
|
+
"""
|
|
17
|
+
Normalize types, handle unsupported types
|
|
18
|
+
|
|
19
|
+
Map complex types like pandas.DataFrame to Any
|
|
20
|
+
"""
|
|
21
|
+
# Get type name
|
|
22
|
+
type_name = getattr(param_type, "__name__", str(param_type))
|
|
23
|
+
|
|
24
|
+
# Check if it's a pandas type
|
|
25
|
+
if "DataFrame" in type_name or "Series" in type_name:
|
|
26
|
+
return Any
|
|
27
|
+
|
|
28
|
+
return param_type
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _extract_param_description_from_docstring(docstring: str, param_name: str) -> Optional[str]:
|
|
32
|
+
"""
|
|
33
|
+
Extract parameter description from docstring
|
|
34
|
+
|
|
35
|
+
Supported formats:
|
|
36
|
+
- Google style: Args: param_name: description
|
|
37
|
+
- NumPy style: Parameters: param_name : type description
|
|
38
|
+
"""
|
|
39
|
+
if not docstring:
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
lines = docstring.split("\n")
|
|
43
|
+
in_args_section = False
|
|
44
|
+
current_param = None
|
|
45
|
+
description_lines = []
|
|
46
|
+
|
|
47
|
+
for line in lines:
|
|
48
|
+
stripped = line.strip()
|
|
49
|
+
|
|
50
|
+
# Detect Args/Parameters section
|
|
51
|
+
if stripped in ["Args:", "Arguments:", "Parameters:"]:
|
|
52
|
+
in_args_section = True
|
|
53
|
+
continue
|
|
54
|
+
|
|
55
|
+
# Detect end
|
|
56
|
+
if in_args_section and stripped in [
|
|
57
|
+
"Returns:",
|
|
58
|
+
"Raises:",
|
|
59
|
+
"Yields:",
|
|
60
|
+
"Examples:",
|
|
61
|
+
"Note:",
|
|
62
|
+
"Notes:",
|
|
63
|
+
]:
|
|
64
|
+
break
|
|
65
|
+
|
|
66
|
+
if in_args_section:
|
|
67
|
+
# Google style: param_name: description or param_name (type):
|
|
68
|
+
# description
|
|
69
|
+
if ":" in stripped and not stripped.startswith(" "):
|
|
70
|
+
# Save previous parameter
|
|
71
|
+
if current_param == param_name and description_lines:
|
|
72
|
+
return " ".join(description_lines).strip()
|
|
73
|
+
|
|
74
|
+
# Parse new parameter
|
|
75
|
+
parts = stripped.split(":", 1)
|
|
76
|
+
if len(parts) == 2:
|
|
77
|
+
# Remove possible type annotation (type)
|
|
78
|
+
param_part = parts[0].strip()
|
|
79
|
+
if "(" in param_part:
|
|
80
|
+
param_part = param_part.split("(")[0].strip()
|
|
81
|
+
|
|
82
|
+
current_param = param_part
|
|
83
|
+
description_lines = [parts[1].strip()]
|
|
84
|
+
elif current_param and stripped:
|
|
85
|
+
# Continue description
|
|
86
|
+
description_lines.append(stripped)
|
|
87
|
+
|
|
88
|
+
# Check last parameter
|
|
89
|
+
if current_param == param_name and description_lines:
|
|
90
|
+
return " ".join(description_lines).strip()
|
|
91
|
+
|
|
92
|
+
return None
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def generate_schema_from_method(
|
|
96
|
+
method: callable, method_name: str, base_class: Type[BaseModel] = BaseModel
|
|
97
|
+
) -> Optional[Type[BaseModel]]:
|
|
98
|
+
"""
|
|
99
|
+
Automatically generate Pydantic Schema from method signature
|
|
100
|
+
|
|
101
|
+
Args:
|
|
102
|
+
method: Method to generate Schema for
|
|
103
|
+
method_name: Method name
|
|
104
|
+
base_class: Schema base class
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
Generated Pydantic Schema class, returns None if unable to generate
|
|
108
|
+
"""
|
|
109
|
+
try:
|
|
110
|
+
# Get method signature
|
|
111
|
+
sig = inspect.signature(method)
|
|
112
|
+
|
|
113
|
+
# Get type annotations
|
|
114
|
+
try:
|
|
115
|
+
type_hints = get_type_hints(method)
|
|
116
|
+
except Exception as e:
|
|
117
|
+
logger.debug(f"Failed to get type hints for {method_name}: {e}")
|
|
118
|
+
type_hints = {}
|
|
119
|
+
|
|
120
|
+
# Get docstring
|
|
121
|
+
docstring = inspect.getdoc(method) or f"Execute {method_name} operation"
|
|
122
|
+
|
|
123
|
+
# Extract short description (first line)
|
|
124
|
+
first_line = docstring.split("\n")[0].strip()
|
|
125
|
+
schema_description = first_line if first_line else f"Execute {method_name} operation"
|
|
126
|
+
|
|
127
|
+
# Build field definitions
|
|
128
|
+
field_definitions = {}
|
|
129
|
+
|
|
130
|
+
for param_name, param in sig.parameters.items():
|
|
131
|
+
# Skip self parameter
|
|
132
|
+
if param_name == "self":
|
|
133
|
+
continue
|
|
134
|
+
|
|
135
|
+
# Get parameter type and normalize
|
|
136
|
+
param_type = type_hints.get(param_name, Any)
|
|
137
|
+
param_type = _normalize_type(param_type)
|
|
138
|
+
|
|
139
|
+
# Get default value
|
|
140
|
+
has_default = param.default != inspect.Parameter.empty
|
|
141
|
+
default_value = param.default if has_default else ...
|
|
142
|
+
|
|
143
|
+
# Extract parameter description from docstring
|
|
144
|
+
field_description = _extract_param_description_from_docstring(docstring, param_name)
|
|
145
|
+
if not field_description:
|
|
146
|
+
field_description = f"Parameter {param_name}"
|
|
147
|
+
|
|
148
|
+
# Create Field
|
|
149
|
+
if has_default:
|
|
150
|
+
if default_value is None:
|
|
151
|
+
# Optional parameter
|
|
152
|
+
field_definitions[param_name] = (
|
|
153
|
+
param_type,
|
|
154
|
+
Field(default=None, description=field_description),
|
|
155
|
+
)
|
|
156
|
+
else:
|
|
157
|
+
field_definitions[param_name] = (
|
|
158
|
+
param_type,
|
|
159
|
+
Field(
|
|
160
|
+
default=default_value,
|
|
161
|
+
description=field_description,
|
|
162
|
+
),
|
|
163
|
+
)
|
|
164
|
+
else:
|
|
165
|
+
# Required parameter
|
|
166
|
+
field_definitions[param_name] = (
|
|
167
|
+
param_type,
|
|
168
|
+
Field(description=field_description),
|
|
169
|
+
)
|
|
170
|
+
|
|
171
|
+
# If no parameters (except self), return None
|
|
172
|
+
if not field_definitions:
|
|
173
|
+
logger.debug(f"No parameters found for {method_name}, skipping schema generation")
|
|
174
|
+
return None
|
|
175
|
+
|
|
176
|
+
# Generate Schema class name
|
|
177
|
+
schema_name = f"{method_name.title().replace('_', '')}Schema"
|
|
178
|
+
|
|
179
|
+
# Create Schema class, allow arbitrary types
|
|
180
|
+
schema_class = create_model(
|
|
181
|
+
schema_name,
|
|
182
|
+
__base__=base_class,
|
|
183
|
+
__doc__=schema_description,
|
|
184
|
+
__config__=ConfigDict(arbitrary_types_allowed=True),
|
|
185
|
+
**field_definitions,
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
logger.debug(f"Generated schema {schema_name} for method {method_name}")
|
|
189
|
+
return schema_class
|
|
190
|
+
|
|
191
|
+
except Exception as e:
|
|
192
|
+
logger.warning(f"Failed to generate schema for {method_name}: {e}")
|
|
193
|
+
return None
|
|
194
|
+
|
|
195
|
+
|
|
196
|
+
def generate_schemas_for_tool(tool_class: Type) -> Dict[str, Type[BaseModel]]:
|
|
197
|
+
"""
|
|
198
|
+
Generate Schema for all methods of a tool class
|
|
199
|
+
|
|
200
|
+
Args:
|
|
201
|
+
tool_class: Tool class
|
|
202
|
+
|
|
203
|
+
Returns:
|
|
204
|
+
Mapping from method names to Schema classes
|
|
205
|
+
"""
|
|
206
|
+
schemas = {}
|
|
207
|
+
|
|
208
|
+
for method_name in dir(tool_class):
|
|
209
|
+
# Skip private methods and special methods
|
|
210
|
+
if method_name.startswith("_"):
|
|
211
|
+
continue
|
|
212
|
+
|
|
213
|
+
# Skip base class methods
|
|
214
|
+
if method_name in ["run", "run_async", "run_batch"]:
|
|
215
|
+
continue
|
|
216
|
+
|
|
217
|
+
method = getattr(tool_class, method_name)
|
|
218
|
+
|
|
219
|
+
# Skip non-method attributes
|
|
220
|
+
if not callable(method):
|
|
221
|
+
continue
|
|
222
|
+
|
|
223
|
+
# Skip classes (like Config, Schema, etc.)
|
|
224
|
+
if isinstance(method, type):
|
|
225
|
+
continue
|
|
226
|
+
|
|
227
|
+
# Generate Schema
|
|
228
|
+
schema = generate_schema_from_method(method, method_name)
|
|
229
|
+
|
|
230
|
+
if schema:
|
|
231
|
+
# Normalize method name (remove underscores, convert to lowercase)
|
|
232
|
+
normalized_name = method_name.replace("_", "").lower()
|
|
233
|
+
schemas[normalized_name] = schema
|
|
234
|
+
logger.info(f"Generated schema for {method_name}")
|
|
235
|
+
|
|
236
|
+
return schemas
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
# Usage example
|
|
240
|
+
if __name__ == "__main__":
|
|
241
|
+
import sys
|
|
242
|
+
|
|
243
|
+
sys.path.insert(0, "/home/coder1/python-middleware-dev")
|
|
244
|
+
|
|
245
|
+
from aiecs.tools import discover_tools, TOOL_CLASSES
|
|
246
|
+
|
|
247
|
+
# Configure logging
|
|
248
|
+
logging.basicConfig(level=logging.INFO)
|
|
249
|
+
|
|
250
|
+
# Discover tools
|
|
251
|
+
discover_tools()
|
|
252
|
+
|
|
253
|
+
# Generate Schema for PandasTool
|
|
254
|
+
print("Generating Schema for PandasTool:")
|
|
255
|
+
print("=" * 80)
|
|
256
|
+
|
|
257
|
+
pandas_tool = TOOL_CLASSES["pandas"]
|
|
258
|
+
schemas = generate_schemas_for_tool(pandas_tool)
|
|
259
|
+
|
|
260
|
+
print(f"\nGenerated {len(schemas)} Schemas:\n")
|
|
261
|
+
|
|
262
|
+
# Show first 3 examples
|
|
263
|
+
for method_name, schema in list(schemas.items())[:3]:
|
|
264
|
+
print(f"{schema.__name__}:")
|
|
265
|
+
print(f" Description: {schema.__doc__}")
|
|
266
|
+
print(" Fields:")
|
|
267
|
+
for field_name, field_info in schema.model_fields.items():
|
|
268
|
+
required = "Required" if field_info.is_required() else "Optional"
|
|
269
|
+
default = (
|
|
270
|
+
f" (default: {field_info.default})"
|
|
271
|
+
if not field_info.is_required() and field_info.default is not None
|
|
272
|
+
else ""
|
|
273
|
+
)
|
|
274
|
+
print(f" - {field_name}: {field_info.description} [{required}]{default}")
|
|
275
|
+
print()
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Enhanced Search Tool Package
|
|
3
|
+
|
|
4
|
+
A comprehensive, production-ready web search tool that integrates Google Custom Search API
|
|
5
|
+
with advanced features including:
|
|
6
|
+
|
|
7
|
+
- Result quality scoring and ranking
|
|
8
|
+
- Query intent analysis and optimization
|
|
9
|
+
- Result deduplication
|
|
10
|
+
- Context-aware search with history tracking
|
|
11
|
+
- Intelligent Redis caching with intent-aware TTL
|
|
12
|
+
- Comprehensive metrics and monitoring
|
|
13
|
+
- Agent-friendly error handling
|
|
14
|
+
|
|
15
|
+
Features:
|
|
16
|
+
- Multiple search types: web, image, news, video
|
|
17
|
+
- Dual authentication: API key and service account
|
|
18
|
+
- Rate limiting with token bucket algorithm
|
|
19
|
+
- Circuit breaker pattern for API resilience
|
|
20
|
+
- Intelligent caching with Redis backend
|
|
21
|
+
- Quality analysis with authority, relevance, and freshness scoring
|
|
22
|
+
- Query enhancement based on detected intent
|
|
23
|
+
- Structured result summaries
|
|
24
|
+
- Search context tracking and preference learning
|
|
25
|
+
- Enhanced metrics and health scoring
|
|
26
|
+
- Agent-optimized error messages with actionable suggestions
|
|
27
|
+
|
|
28
|
+
Usage:
|
|
29
|
+
from aiecs.tools.search_tool import SearchTool
|
|
30
|
+
|
|
31
|
+
# Create search tool instance
|
|
32
|
+
search_tool = SearchTool()
|
|
33
|
+
|
|
34
|
+
# Perform enhanced web search
|
|
35
|
+
results = search_tool.search_web(
|
|
36
|
+
query="machine learning tutorial",
|
|
37
|
+
auto_enhance=True,
|
|
38
|
+
return_summary=True
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
# Access results and quality analysis
|
|
42
|
+
for result in results['results']:
|
|
43
|
+
print(f"Title: {result['title']}")
|
|
44
|
+
print(f"Quality: {result['_quality_summary']['score']:.2f}")
|
|
45
|
+
print(f"Credibility: {result['_quality_summary']['level']}")
|
|
46
|
+
|
|
47
|
+
# Check metrics
|
|
48
|
+
print(search_tool.get_metrics_report())
|
|
49
|
+
"""
|
|
50
|
+
|
|
51
|
+
from aiecs.tools import register_tool
|
|
52
|
+
from .core import SearchTool
|
|
53
|
+
from .constants import (
|
|
54
|
+
SearchType,
|
|
55
|
+
SafeSearch,
|
|
56
|
+
ImageSize,
|
|
57
|
+
ImageType,
|
|
58
|
+
ImageColorType,
|
|
59
|
+
QueryIntentType,
|
|
60
|
+
CredibilityLevel,
|
|
61
|
+
CircuitState,
|
|
62
|
+
# Exceptions
|
|
63
|
+
SearchToolError,
|
|
64
|
+
AuthenticationError,
|
|
65
|
+
QuotaExceededError,
|
|
66
|
+
RateLimitError,
|
|
67
|
+
CircuitBreakerOpenError,
|
|
68
|
+
SearchAPIError,
|
|
69
|
+
ValidationError,
|
|
70
|
+
CacheError,
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
# Register the tool with the AIECS tool registry
|
|
74
|
+
# Note: Tool is registered as "search" (not "search_tool") for consistency
|
|
75
|
+
register_tool("search")(SearchTool)
|
|
76
|
+
|
|
77
|
+
__all__ = [
|
|
78
|
+
# Main class
|
|
79
|
+
"SearchTool",
|
|
80
|
+
# Enums
|
|
81
|
+
"SearchType",
|
|
82
|
+
"SafeSearch",
|
|
83
|
+
"ImageSize",
|
|
84
|
+
"ImageType",
|
|
85
|
+
"ImageColorType",
|
|
86
|
+
"QueryIntentType",
|
|
87
|
+
"CredibilityLevel",
|
|
88
|
+
"CircuitState",
|
|
89
|
+
# Exceptions
|
|
90
|
+
"SearchToolError",
|
|
91
|
+
"AuthenticationError",
|
|
92
|
+
"QuotaExceededError",
|
|
93
|
+
"RateLimitError",
|
|
94
|
+
"CircuitBreakerOpenError",
|
|
95
|
+
"SearchAPIError",
|
|
96
|
+
"ValidationError",
|
|
97
|
+
"CacheError",
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
__version__ = "2.0.0"
|