aiecs 1.5.1__py3-none-any.whl

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