aiecs 1.0.1__py3-none-any.whl → 1.7.6__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 +399 -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 +3870 -0
- aiecs/domain/agent/exceptions.py +99 -0
- aiecs/domain/agent/graph_aware_mixin.py +569 -0
- aiecs/domain/agent/hybrid_agent.py +1435 -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 +884 -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 +364 -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 +224 -36
- aiecs/llm/client_resolver.py +155 -0
- aiecs/llm/clients/__init__.py +38 -0
- aiecs/llm/clients/base_client.py +324 -0
- aiecs/llm/clients/google_function_calling_mixin.py +457 -0
- aiecs/llm/clients/googleai_client.py +241 -0
- aiecs/llm/clients/openai_client.py +158 -0
- aiecs/llm/clients/openai_compatible_mixin.py +367 -0
- aiecs/llm/clients/vertex_client.py +897 -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 +1323 -0
- aiecs/tools/docs/document_layout_tool.py +1160 -0
- aiecs/tools/docs/document_parser_tool.py +1011 -0
- aiecs/tools/docs/document_writer_tool.py +1829 -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 +175 -131
- 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.6.dist-info}/METADATA +52 -15
- aiecs-1.7.6.dist-info/RECORD +337 -0
- aiecs-1.7.6.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.6.dist-info}/WHEEL +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/licenses/LICENSE +0 -0
- {aiecs-1.0.1.dist-info → aiecs-1.7.6.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,455 @@
|
|
|
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
|
+
import re
|
|
10
|
+
from typing import Any, Dict, Optional, Type, get_type_hints, Callable, List, Union, get_origin, get_args
|
|
11
|
+
from pydantic import BaseModel, Field, create_model, ConfigDict, ValidationError
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _normalize_type(param_type: Type) -> Type:
|
|
17
|
+
"""
|
|
18
|
+
Normalize types, handle unsupported types and generics
|
|
19
|
+
|
|
20
|
+
Map complex types like pandas.DataFrame, pandas.Series to Any.
|
|
21
|
+
Handle generics like List[T], Dict[K, V], Optional[T], Union[T, U].
|
|
22
|
+
"""
|
|
23
|
+
# Handle None type
|
|
24
|
+
if param_type is type(None):
|
|
25
|
+
return Any
|
|
26
|
+
|
|
27
|
+
# Handle generics (List, Dict, Optional, Union, etc.)
|
|
28
|
+
origin = get_origin(param_type)
|
|
29
|
+
if origin is not None:
|
|
30
|
+
# Handle Optional[T] which is Union[T, None]
|
|
31
|
+
if origin is Union:
|
|
32
|
+
args = get_args(param_type)
|
|
33
|
+
# Filter out None type
|
|
34
|
+
non_none_args = [arg for arg in args if arg is not type(None)]
|
|
35
|
+
if len(non_none_args) == 1:
|
|
36
|
+
# Optional[T] -> normalize T
|
|
37
|
+
return _normalize_type(non_none_args[0])
|
|
38
|
+
elif len(non_none_args) > 1:
|
|
39
|
+
# Union[T, U, ...] -> Any (too complex)
|
|
40
|
+
return Any
|
|
41
|
+
else:
|
|
42
|
+
# Union[None] -> Any
|
|
43
|
+
return Any
|
|
44
|
+
|
|
45
|
+
# Handle List[T], Dict[K, V], Tuple[T, ...], etc.
|
|
46
|
+
# For now, simplify to List[Any] or Dict[str, Any]
|
|
47
|
+
if origin is list or origin is List:
|
|
48
|
+
return List[Any]
|
|
49
|
+
elif origin is dict or origin is Dict:
|
|
50
|
+
return Dict[str, Any]
|
|
51
|
+
else:
|
|
52
|
+
# Other generics -> Any
|
|
53
|
+
return Any
|
|
54
|
+
|
|
55
|
+
# Get type name
|
|
56
|
+
type_name = getattr(param_type, "__name__", str(param_type))
|
|
57
|
+
type_str = str(param_type)
|
|
58
|
+
|
|
59
|
+
# Check if it's a pandas type
|
|
60
|
+
if "DataFrame" in type_name or "Series" in type_name or "pandas" in type_str.lower():
|
|
61
|
+
return Any
|
|
62
|
+
|
|
63
|
+
# Check for other complex types that might not be supported
|
|
64
|
+
# numpy arrays, scipy types, etc.
|
|
65
|
+
if "numpy" in type_str.lower() or "scipy" in type_str.lower():
|
|
66
|
+
return Any
|
|
67
|
+
|
|
68
|
+
# Check for callable types (functions)
|
|
69
|
+
if "Callable" in type_str or callable(param_type) and not isinstance(param_type, type):
|
|
70
|
+
return Any
|
|
71
|
+
|
|
72
|
+
return param_type
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def _extract_param_description_from_docstring(docstring: str, param_name: str) -> Optional[str]:
|
|
76
|
+
"""
|
|
77
|
+
Extract parameter description from docstring
|
|
78
|
+
|
|
79
|
+
Supported formats:
|
|
80
|
+
- Google style: Args: param_name: description
|
|
81
|
+
- NumPy style: Parameters: param_name : type description
|
|
82
|
+
- Sphinx style: :param param_name: description
|
|
83
|
+
"""
|
|
84
|
+
if not docstring:
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
lines = docstring.split("\n")
|
|
88
|
+
in_args_section = False
|
|
89
|
+
current_param = None
|
|
90
|
+
description_lines: List[str] = []
|
|
91
|
+
|
|
92
|
+
for line in lines:
|
|
93
|
+
stripped = line.strip()
|
|
94
|
+
|
|
95
|
+
# Detect Args/Parameters section (Google/NumPy style)
|
|
96
|
+
if stripped in ["Args:", "Arguments:", "Parameters:"]:
|
|
97
|
+
in_args_section = True
|
|
98
|
+
continue
|
|
99
|
+
|
|
100
|
+
# Detect Sphinx style parameter
|
|
101
|
+
sphinx_pattern = rf":param\s+{re.escape(param_name)}\s*:"
|
|
102
|
+
if re.match(sphinx_pattern, stripped, re.IGNORECASE):
|
|
103
|
+
# Extract description after colon
|
|
104
|
+
parts = stripped.split(":", 2)
|
|
105
|
+
if len(parts) >= 3:
|
|
106
|
+
desc = parts[2].strip()
|
|
107
|
+
if desc:
|
|
108
|
+
return desc
|
|
109
|
+
continue
|
|
110
|
+
|
|
111
|
+
# Detect end of Args section
|
|
112
|
+
if in_args_section and stripped in [
|
|
113
|
+
"Returns:",
|
|
114
|
+
"Raises:",
|
|
115
|
+
"Yields:",
|
|
116
|
+
"Examples:",
|
|
117
|
+
"Note:",
|
|
118
|
+
"Notes:",
|
|
119
|
+
"See Also:",
|
|
120
|
+
"Attributes:",
|
|
121
|
+
]:
|
|
122
|
+
break
|
|
123
|
+
|
|
124
|
+
if in_args_section:
|
|
125
|
+
# Google style: param_name: description or param_name (type): description
|
|
126
|
+
if ":" in stripped and not stripped.startswith(" "):
|
|
127
|
+
# Save previous parameter
|
|
128
|
+
if current_param == param_name and description_lines:
|
|
129
|
+
return " ".join(description_lines).strip()
|
|
130
|
+
|
|
131
|
+
# Parse new parameter
|
|
132
|
+
parts = stripped.split(":", 1)
|
|
133
|
+
if len(parts) == 2:
|
|
134
|
+
# Remove possible type annotation (type) or [type]
|
|
135
|
+
param_part = parts[0].strip()
|
|
136
|
+
# Handle param_name (type): or param_name [type]:
|
|
137
|
+
param_part = re.sub(r'\s*\([^)]*\)\s*$', '', param_part) # Remove (type)
|
|
138
|
+
param_part = re.sub(r'\s*\[[^\]]*\]\s*$', '', param_part) # Remove [type]
|
|
139
|
+
param_part = param_part.strip()
|
|
140
|
+
|
|
141
|
+
current_param = param_part
|
|
142
|
+
description_lines = [parts[1].strip()]
|
|
143
|
+
elif current_param and stripped:
|
|
144
|
+
# Continue description (indented lines)
|
|
145
|
+
if stripped.startswith(" ") or not stripped:
|
|
146
|
+
description_lines.append(stripped)
|
|
147
|
+
else:
|
|
148
|
+
# New section or parameter, save current if it matches
|
|
149
|
+
if current_param == param_name and description_lines:
|
|
150
|
+
return " ".join(description_lines).strip()
|
|
151
|
+
current_param = None
|
|
152
|
+
description_lines = []
|
|
153
|
+
|
|
154
|
+
# Check last parameter
|
|
155
|
+
if current_param == param_name and description_lines:
|
|
156
|
+
return " ".join(description_lines).strip()
|
|
157
|
+
|
|
158
|
+
# Try NumPy style: param_name : type description
|
|
159
|
+
# This is more lenient and looks for "param_name :" pattern
|
|
160
|
+
numpy_pattern = rf"^{re.escape(param_name)}\s*:\s*(.+)$"
|
|
161
|
+
for line in lines:
|
|
162
|
+
stripped = line.strip()
|
|
163
|
+
match = re.match(numpy_pattern, stripped, re.IGNORECASE)
|
|
164
|
+
if match:
|
|
165
|
+
desc = match.group(1).strip()
|
|
166
|
+
if desc:
|
|
167
|
+
return desc
|
|
168
|
+
|
|
169
|
+
return None
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def generate_schema_from_method(method: Callable[..., Any], method_name: str, base_class: Type[BaseModel] = BaseModel) -> Optional[Type[BaseModel]]:
|
|
173
|
+
"""
|
|
174
|
+
Automatically generate Pydantic Schema from method signature
|
|
175
|
+
|
|
176
|
+
Args:
|
|
177
|
+
method: Method to generate Schema for
|
|
178
|
+
method_name: Method name
|
|
179
|
+
base_class: Schema base class
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
Generated Pydantic Schema class, returns None if unable to generate
|
|
183
|
+
"""
|
|
184
|
+
try:
|
|
185
|
+
# Get method signature
|
|
186
|
+
sig = inspect.signature(method)
|
|
187
|
+
|
|
188
|
+
# Get type annotations
|
|
189
|
+
try:
|
|
190
|
+
type_hints = get_type_hints(method)
|
|
191
|
+
except Exception as e:
|
|
192
|
+
logger.debug(f"Failed to get type hints for {method_name}: {e}")
|
|
193
|
+
type_hints = {}
|
|
194
|
+
|
|
195
|
+
# Get docstring
|
|
196
|
+
docstring = inspect.getdoc(method) or f"Execute {method_name} operation"
|
|
197
|
+
|
|
198
|
+
# Extract short description (first line)
|
|
199
|
+
first_line = docstring.split("\n")[0].strip()
|
|
200
|
+
schema_description = first_line if first_line else f"Execute {method_name} operation"
|
|
201
|
+
|
|
202
|
+
# Build field definitions
|
|
203
|
+
field_definitions = {}
|
|
204
|
+
|
|
205
|
+
for param_name, param in sig.parameters.items():
|
|
206
|
+
# Skip self parameter
|
|
207
|
+
if param_name == "self":
|
|
208
|
+
continue
|
|
209
|
+
|
|
210
|
+
# Get parameter type and normalize
|
|
211
|
+
param_type = type_hints.get(param_name, Any)
|
|
212
|
+
|
|
213
|
+
# Handle Optional[T] explicitly - check if default is None or type is Optional
|
|
214
|
+
has_default = param.default != inspect.Parameter.empty
|
|
215
|
+
default_value = param.default if has_default else inspect.Parameter.empty
|
|
216
|
+
|
|
217
|
+
# Check if type is Optional or Union with None
|
|
218
|
+
origin = get_origin(param_type)
|
|
219
|
+
is_optional = False
|
|
220
|
+
if origin is Union:
|
|
221
|
+
args = get_args(param_type)
|
|
222
|
+
if type(None) in args:
|
|
223
|
+
is_optional = True
|
|
224
|
+
# Extract the non-None type
|
|
225
|
+
non_none_args = [arg for arg in args if arg is not type(None)]
|
|
226
|
+
if non_none_args:
|
|
227
|
+
param_type = non_none_args[0]
|
|
228
|
+
|
|
229
|
+
# Normalize the type
|
|
230
|
+
param_type = _normalize_type(param_type)
|
|
231
|
+
|
|
232
|
+
# If default is None or type is Optional, make it Optional
|
|
233
|
+
if default_value is None or (has_default and default_value == inspect.Parameter.empty and is_optional):
|
|
234
|
+
param_type = Optional[param_type]
|
|
235
|
+
elif has_default and default_value == inspect.Parameter.empty:
|
|
236
|
+
# Parameter with default but not None - use the actual default
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
# Extract parameter description from docstring
|
|
240
|
+
field_description = _extract_param_description_from_docstring(docstring, param_name)
|
|
241
|
+
if not field_description:
|
|
242
|
+
field_description = f"Parameter {param_name}"
|
|
243
|
+
|
|
244
|
+
# Create Field with proper handling of defaults
|
|
245
|
+
if has_default and default_value != inspect.Parameter.empty:
|
|
246
|
+
if default_value is None:
|
|
247
|
+
# Optional parameter with None default
|
|
248
|
+
field_definitions[param_name] = (
|
|
249
|
+
Optional[param_type],
|
|
250
|
+
Field(default=None, description=field_description),
|
|
251
|
+
)
|
|
252
|
+
else:
|
|
253
|
+
# Parameter with non-None default
|
|
254
|
+
try:
|
|
255
|
+
# Validate default value can be serialized
|
|
256
|
+
field_definitions[param_name] = (
|
|
257
|
+
param_type,
|
|
258
|
+
Field(
|
|
259
|
+
default=default_value,
|
|
260
|
+
description=field_description,
|
|
261
|
+
),
|
|
262
|
+
)
|
|
263
|
+
except Exception as e:
|
|
264
|
+
logger.warning(f"Failed to set default for {param_name}: {e}, using Any")
|
|
265
|
+
field_definitions[param_name] = (
|
|
266
|
+
Any,
|
|
267
|
+
Field(
|
|
268
|
+
default=default_value,
|
|
269
|
+
description=field_description,
|
|
270
|
+
),
|
|
271
|
+
)
|
|
272
|
+
elif is_optional:
|
|
273
|
+
# Optional parameter without explicit default
|
|
274
|
+
field_definitions[param_name] = (
|
|
275
|
+
Optional[param_type],
|
|
276
|
+
Field(default=None, description=field_description),
|
|
277
|
+
)
|
|
278
|
+
else:
|
|
279
|
+
# Required parameter
|
|
280
|
+
field_definitions[param_name] = (
|
|
281
|
+
param_type,
|
|
282
|
+
Field(description=field_description),
|
|
283
|
+
)
|
|
284
|
+
|
|
285
|
+
# If no parameters (except self), return None
|
|
286
|
+
if not field_definitions:
|
|
287
|
+
logger.debug(f"No parameters found for {method_name}, skipping schema generation")
|
|
288
|
+
return None
|
|
289
|
+
|
|
290
|
+
# Generate Schema class name
|
|
291
|
+
schema_name = f"{method_name.title().replace('_', '')}Schema"
|
|
292
|
+
|
|
293
|
+
# Create Schema class, allow arbitrary types
|
|
294
|
+
# In Pydantic v2, create_model signature may vary - use type ignore for dynamic model creation
|
|
295
|
+
try:
|
|
296
|
+
schema_class = create_model( # type: ignore[call-overload]
|
|
297
|
+
schema_name,
|
|
298
|
+
__base__=base_class,
|
|
299
|
+
__doc__=schema_description,
|
|
300
|
+
**field_definitions,
|
|
301
|
+
)
|
|
302
|
+
# Set model_config if base_class supports it
|
|
303
|
+
if hasattr(schema_class, "model_config"):
|
|
304
|
+
schema_class.model_config = ConfigDict(arbitrary_types_allowed=True) # type: ignore[assignment]
|
|
305
|
+
|
|
306
|
+
# Validate the generated schema
|
|
307
|
+
_validate_generated_schema(schema_class, method_name, field_definitions)
|
|
308
|
+
|
|
309
|
+
logger.debug(f"Generated schema {schema_name} for method {method_name}")
|
|
310
|
+
return schema_class
|
|
311
|
+
except Exception as e:
|
|
312
|
+
logger.warning(f"Failed to create schema class for {method_name}: {e}")
|
|
313
|
+
return None
|
|
314
|
+
|
|
315
|
+
except Exception as e:
|
|
316
|
+
logger.warning(f"Failed to generate schema for {method_name}: {e}")
|
|
317
|
+
return None
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
def _validate_generated_schema(
|
|
321
|
+
schema_class: Type[BaseModel],
|
|
322
|
+
method_name: str,
|
|
323
|
+
field_definitions: Dict[str, Any]
|
|
324
|
+
) -> None:
|
|
325
|
+
"""
|
|
326
|
+
Validate that a generated schema is a valid Pydantic model.
|
|
327
|
+
|
|
328
|
+
Args:
|
|
329
|
+
schema_class: The generated schema class
|
|
330
|
+
method_name: Name of the method for error reporting
|
|
331
|
+
field_definitions: The field definitions used to create the schema
|
|
332
|
+
|
|
333
|
+
Raises:
|
|
334
|
+
ValueError: If the schema is invalid
|
|
335
|
+
"""
|
|
336
|
+
# Check it's a subclass of BaseModel
|
|
337
|
+
if not issubclass(schema_class, BaseModel):
|
|
338
|
+
raise ValueError(f"Generated schema for {method_name} is not a BaseModel subclass")
|
|
339
|
+
|
|
340
|
+
# Check it has model_fields
|
|
341
|
+
if not hasattr(schema_class, "model_fields"):
|
|
342
|
+
raise ValueError(f"Generated schema for {method_name} has no model_fields")
|
|
343
|
+
|
|
344
|
+
# Try to instantiate with minimal valid data
|
|
345
|
+
try:
|
|
346
|
+
test_data = {}
|
|
347
|
+
for field_name, field_info in schema_class.model_fields.items():
|
|
348
|
+
if not field_info.is_required():
|
|
349
|
+
# Skip optional fields for validation
|
|
350
|
+
continue
|
|
351
|
+
# Use default test values based on type
|
|
352
|
+
field_type = field_info.annotation
|
|
353
|
+
if field_type == str:
|
|
354
|
+
test_data[field_name] = "test"
|
|
355
|
+
elif field_type == int:
|
|
356
|
+
test_data[field_name] = 0
|
|
357
|
+
elif field_type == float:
|
|
358
|
+
test_data[field_name] = 0.0
|
|
359
|
+
elif field_type == bool:
|
|
360
|
+
test_data[field_name] = False
|
|
361
|
+
elif field_type == list or (hasattr(field_type, "__origin__") and get_origin(field_type) is list):
|
|
362
|
+
test_data[field_name] = []
|
|
363
|
+
elif field_type == dict or (hasattr(field_type, "__origin__") and get_origin(field_type) is dict):
|
|
364
|
+
test_data[field_name] = {}
|
|
365
|
+
else:
|
|
366
|
+
test_data[field_name] = None
|
|
367
|
+
|
|
368
|
+
# Try to create an instance
|
|
369
|
+
instance = schema_class(**test_data)
|
|
370
|
+
if not isinstance(instance, BaseModel):
|
|
371
|
+
raise ValueError(f"Schema instance for {method_name} is not a BaseModel")
|
|
372
|
+
except ValidationError as e:
|
|
373
|
+
# Validation errors are okay - just means our test data wasn't perfect
|
|
374
|
+
logger.debug(f"Schema validation test failed for {method_name} (expected): {e}")
|
|
375
|
+
except Exception as e:
|
|
376
|
+
logger.warning(f"Schema validation test failed for {method_name}: {e}")
|
|
377
|
+
# Don't raise - schema might still be valid for actual use cases
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
def generate_schemas_for_tool(tool_class: Type) -> Dict[str, Type[BaseModel]]:
|
|
381
|
+
"""
|
|
382
|
+
Generate Schema for all methods of a tool class
|
|
383
|
+
|
|
384
|
+
Args:
|
|
385
|
+
tool_class: Tool class
|
|
386
|
+
|
|
387
|
+
Returns:
|
|
388
|
+
Mapping from method names to Schema classes
|
|
389
|
+
"""
|
|
390
|
+
schemas = {}
|
|
391
|
+
|
|
392
|
+
for method_name in dir(tool_class):
|
|
393
|
+
# Skip private methods and special methods
|
|
394
|
+
if method_name.startswith("_"):
|
|
395
|
+
continue
|
|
396
|
+
|
|
397
|
+
# Skip base class methods
|
|
398
|
+
if method_name in ["run", "run_async", "run_batch"]:
|
|
399
|
+
continue
|
|
400
|
+
|
|
401
|
+
method = getattr(tool_class, method_name)
|
|
402
|
+
|
|
403
|
+
# Skip non-method attributes
|
|
404
|
+
if not callable(method):
|
|
405
|
+
continue
|
|
406
|
+
|
|
407
|
+
# Skip classes (like Config, Schema, etc.)
|
|
408
|
+
if isinstance(method, type):
|
|
409
|
+
continue
|
|
410
|
+
|
|
411
|
+
# Generate Schema
|
|
412
|
+
schema = generate_schema_from_method(method, method_name)
|
|
413
|
+
|
|
414
|
+
if schema:
|
|
415
|
+
# Normalize method name (remove underscores, convert to lowercase)
|
|
416
|
+
normalized_name = method_name.replace("_", "").lower()
|
|
417
|
+
schemas[normalized_name] = schema
|
|
418
|
+
logger.info(f"Generated schema for {method_name}")
|
|
419
|
+
|
|
420
|
+
return schemas
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
# Usage example
|
|
424
|
+
if __name__ == "__main__":
|
|
425
|
+
import sys
|
|
426
|
+
|
|
427
|
+
sys.path.insert(0, "/home/coder1/python-middleware-dev")
|
|
428
|
+
|
|
429
|
+
from aiecs.tools import discover_tools, TOOL_CLASSES
|
|
430
|
+
|
|
431
|
+
# Configure logging
|
|
432
|
+
logging.basicConfig(level=logging.INFO)
|
|
433
|
+
|
|
434
|
+
# Discover tools
|
|
435
|
+
discover_tools()
|
|
436
|
+
|
|
437
|
+
# Generate Schema for PandasTool
|
|
438
|
+
print("Generating Schema for PandasTool:")
|
|
439
|
+
print("=" * 80)
|
|
440
|
+
|
|
441
|
+
pandas_tool = TOOL_CLASSES["pandas"]
|
|
442
|
+
schemas = generate_schemas_for_tool(pandas_tool)
|
|
443
|
+
|
|
444
|
+
print(f"\nGenerated {len(schemas)} Schemas:\n")
|
|
445
|
+
|
|
446
|
+
# Show first 3 examples
|
|
447
|
+
for method_name, schema in list(schemas.items())[:3]:
|
|
448
|
+
print(f"{schema.__name__}:")
|
|
449
|
+
print(f" Description: {schema.__doc__}")
|
|
450
|
+
print(" Fields:")
|
|
451
|
+
for field_name, field_info in schema.model_fields.items():
|
|
452
|
+
required = "Required" if field_info.is_required() else "Optional"
|
|
453
|
+
default = f" (default: {field_info.default})" if not field_info.is_required() and field_info.default is not None else ""
|
|
454
|
+
print(f" - {field_name}: {field_info.description} [{required}]{default}")
|
|
455
|
+
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"
|