tooluniverse 1.0.6__py3-none-any.whl → 1.0.7__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 tooluniverse might be problematic. Click here for more details.

Files changed (823) hide show
  1. tooluniverse/__init__.py +31 -0
  2. tooluniverse/agentic_tool.py +40 -4
  3. tooluniverse/arxiv_tool.py +2 -6
  4. tooluniverse/base_tool.py +174 -25
  5. tooluniverse/biorxiv_tool.py +35 -16
  6. tooluniverse/cellosaurus_tool.py +1332 -0
  7. tooluniverse/compose_scripts/enhanced_multi_agent_literature_search.py +310 -0
  8. tooluniverse/compose_scripts/multi_agent_literature_search.py +794 -0
  9. tooluniverse/compose_scripts/tool_graph_generation.py +68 -35
  10. tooluniverse/compose_scripts/tool_metadata_generator.py +205 -105
  11. tooluniverse/compose_tool.py +93 -8
  12. tooluniverse/core_tool.py +46 -44
  13. tooluniverse/crossref_tool.py +89 -4
  14. tooluniverse/data/agentic_tools.json +1271 -1179
  15. tooluniverse/data/alphafold_tools.json +356 -105
  16. tooluniverse/data/arxiv_tools.json +88 -81
  17. tooluniverse/data/biorxiv_tools.json +69 -64
  18. tooluniverse/data/cellosaurus_tools.json +260 -0
  19. tooluniverse/data/chembl_tools.json +27 -12
  20. tooluniverse/data/clinicaltrials_gov_tools.json +377 -302
  21. tooluniverse/data/compose_tools.json +123 -16
  22. tooluniverse/data/core_tools.json +107 -99
  23. tooluniverse/data/crossref_tools.json +131 -63
  24. tooluniverse/data/dailymed_tools.json +17 -3
  25. tooluniverse/data/dataset_tools.json +1031 -588
  26. tooluniverse/data/dblp_tools.json +135 -64
  27. tooluniverse/data/disease_target_score_tools.json +20 -10
  28. tooluniverse/data/doaj_tools.json +133 -87
  29. tooluniverse/data/embedding_tools.json +362 -299
  30. tooluniverse/data/enrichr_tools.json +34 -27
  31. tooluniverse/data/europe_pmc_tools.json +108 -16
  32. tooluniverse/data/fatcat_tools.json +71 -66
  33. tooluniverse/data/fda_drug_adverse_event_tools.json +1061 -445
  34. tooluniverse/data/fda_drug_labeling_tools.json +6858 -6901
  35. tooluniverse/data/finder_tools.json +32 -37
  36. tooluniverse/data/gene_ontology_tools.json +19 -7
  37. tooluniverse/data/gwas_tools.json +1720 -959
  38. tooluniverse/data/hal_tools.json +69 -64
  39. tooluniverse/data/hpa_tools.json +53 -14
  40. tooluniverse/data/humanbase_tools.json +51 -43
  41. tooluniverse/data/idmap_tools.json +76 -70
  42. tooluniverse/data/literature_search_tools.json +306 -0
  43. tooluniverse/data/mcp_client_tools_example.json +122 -107
  44. tooluniverse/data/medlineplus_tools.json +50 -10
  45. tooluniverse/data/medrxiv_tools.json +69 -64
  46. tooluniverse/data/molecule_2d_tools.json +134 -0
  47. tooluniverse/data/molecule_3d_tools.json +164 -0
  48. tooluniverse/data/monarch_tools.json +112 -110
  49. tooluniverse/data/odphp_tools.json +389 -119
  50. tooluniverse/data/openaire_tools.json +89 -79
  51. tooluniverse/data/openalex_tools.json +100 -31
  52. tooluniverse/data/opentarget_tools.json +1457 -1372
  53. tooluniverse/data/osf_preprints_tools.json +77 -73
  54. tooluniverse/data/packages/bioinformatics_core_tools.json +40 -10
  55. tooluniverse/data/packages/cheminformatics_tools.json +20 -5
  56. tooluniverse/data/packages/genomics_tools.json +36 -9
  57. tooluniverse/data/packages/machine_learning_tools.json +36 -9
  58. tooluniverse/data/packages/scientific_computing_tools.json +20 -5
  59. tooluniverse/data/packages/single_cell_tools.json +20 -5
  60. tooluniverse/data/packages/structural_biology_tools.json +16 -4
  61. tooluniverse/data/packages/visualization_tools.json +20 -5
  62. tooluniverse/data/pmc_tools.json +111 -103
  63. tooluniverse/data/protein_structure_3d_tools.json +138 -0
  64. tooluniverse/data/pubchem_tools.json +37 -12
  65. tooluniverse/data/pubmed_tools.json +126 -58
  66. tooluniverse/data/pubtator_tools.json +68 -60
  67. tooluniverse/data/rcsb_pdb_tools.json +1532 -1221
  68. tooluniverse/data/semantic_scholar_tools.json +55 -22
  69. tooluniverse/data/special_tools.json +8 -6
  70. tooluniverse/data/tool_composition_tools.json +112 -82
  71. tooluniverse/data/unified_guideline_tools.json +707 -0
  72. tooluniverse/data/url_fetch_tools.json +102 -82
  73. tooluniverse/data/uspto_tools.json +49 -30
  74. tooluniverse/data/wikidata_sparql_tools.json +42 -39
  75. tooluniverse/data/xml_tools.json +3274 -3113
  76. tooluniverse/data/zenodo_tools.json +84 -76
  77. tooluniverse/dblp_tool.py +76 -6
  78. tooluniverse/default_config.py +13 -0
  79. tooluniverse/doaj_tool.py +76 -17
  80. tooluniverse/doctor.py +48 -0
  81. tooluniverse/europe_pmc_tool.py +132 -17
  82. tooluniverse/exceptions.py +170 -0
  83. tooluniverse/execute_function.py +784 -362
  84. tooluniverse/fatcat_tool.py +0 -1
  85. tooluniverse/generate_tools.py +198 -0
  86. tooluniverse/hal_tool.py +1 -1
  87. tooluniverse/llm_clients.py +101 -124
  88. tooluniverse/mcp_tool_registry.py +4 -1
  89. tooluniverse/medrxiv_tool.py +32 -13
  90. tooluniverse/memory_manager.py +166 -0
  91. tooluniverse/molecule_2d_tool.py +274 -0
  92. tooluniverse/molecule_3d_tool.py +441 -0
  93. tooluniverse/odphp_tool.py +49 -14
  94. tooluniverse/openaire_tool.py +5 -20
  95. tooluniverse/openalex_tool.py +34 -0
  96. tooluniverse/osf_preprints_tool.py +1 -1
  97. tooluniverse/pmc_tool.py +54 -56
  98. tooluniverse/protein_structure_3d_tool.py +295 -0
  99. tooluniverse/pubmed_tool.py +69 -6
  100. tooluniverse/remote/boltz/boltz_mcp_server.py +3 -1
  101. tooluniverse/remote/uspto_downloader/uspto_downloader_mcp_server.py +3 -1
  102. tooluniverse/semantic_scholar_tool.py +40 -10
  103. tooluniverse/smcp.py +140 -205
  104. tooluniverse/smcp_server.py +97 -55
  105. tooluniverse/tool_registry.py +35 -3
  106. tooluniverse/tools/ADMETAI_predict_BBB_penetrance.py +46 -0
  107. tooluniverse/tools/ADMETAI_predict_CYP_interactions.py +46 -0
  108. tooluniverse/tools/ADMETAI_predict_bioavailability.py +46 -0
  109. tooluniverse/tools/ADMETAI_predict_clearance_distribution.py +49 -0
  110. tooluniverse/tools/ADMETAI_predict_nuclear_receptor_activity.py +49 -0
  111. tooluniverse/tools/ADMETAI_predict_physicochemical_properties.py +49 -0
  112. tooluniverse/tools/ADMETAI_predict_solubility_lipophilicity_hydration.py +49 -0
  113. tooluniverse/tools/ADMETAI_predict_stress_response.py +46 -0
  114. tooluniverse/tools/ADMETAI_predict_toxicity.py +46 -0
  115. tooluniverse/tools/AdvancedCodeQualityAnalyzer.py +63 -0
  116. tooluniverse/tools/AdverseEventICDMapper.py +46 -0
  117. tooluniverse/tools/AdverseEventPredictionQuestionGenerator.py +52 -0
  118. tooluniverse/tools/AdverseEventPredictionQuestionGeneratorWithContext.py +59 -0
  119. tooluniverse/tools/ArXiv_search_papers.py +63 -0
  120. tooluniverse/tools/ArgumentDescriptionOptimizer.py +55 -0
  121. tooluniverse/tools/BioRxiv_search_preprints.py +52 -0
  122. tooluniverse/tools/BiomarkerDiscoveryWorkflow.py +55 -0
  123. tooluniverse/tools/CORE_search_papers.py +67 -0
  124. tooluniverse/tools/CallAgent.py +46 -0
  125. tooluniverse/tools/ChEMBL_search_similar_molecules.py +59 -0
  126. tooluniverse/tools/CodeOptimizer.py +55 -0
  127. tooluniverse/tools/CodeQualityAnalyzer.py +71 -0
  128. tooluniverse/tools/ComprehensiveDrugDiscoveryPipeline.py +49 -0
  129. tooluniverse/tools/Crossref_search_works.py +55 -0
  130. tooluniverse/tools/DBLP_search_publications.py +52 -0
  131. tooluniverse/tools/DOAJ_search_articles.py +55 -0
  132. tooluniverse/tools/DailyMed_get_spl_by_setid.py +52 -0
  133. tooluniverse/tools/DailyMed_search_spls.py +79 -0
  134. tooluniverse/tools/DataAnalysisValidityReviewer.py +49 -0
  135. tooluniverse/tools/DescriptionAnalyzer.py +55 -0
  136. tooluniverse/tools/DescriptionQualityEvaluator.py +59 -0
  137. tooluniverse/tools/DomainExpertValidator.py +63 -0
  138. tooluniverse/tools/DrugSafetyAnalyzer.py +59 -0
  139. tooluniverse/tools/EthicalComplianceReviewer.py +49 -0
  140. tooluniverse/tools/EuropePMC_Guidelines_Search.py +52 -0
  141. tooluniverse/tools/EuropePMC_search_articles.py +52 -0
  142. tooluniverse/tools/ExperimentalDesignScorer.py +55 -0
  143. tooluniverse/tools/FAERS_count_additive_administration_routes.py +52 -0
  144. tooluniverse/tools/FAERS_count_additive_adverse_reactions.py +71 -0
  145. tooluniverse/tools/FAERS_count_additive_event_reports_by_country.py +63 -0
  146. tooluniverse/tools/FAERS_count_additive_reaction_outcomes.py +63 -0
  147. tooluniverse/tools/FAERS_count_additive_reports_by_reporter_country.py +63 -0
  148. tooluniverse/tools/FAERS_count_additive_seriousness_classification.py +63 -0
  149. tooluniverse/tools/FAERS_count_country_by_drug_event.py +63 -0
  150. tooluniverse/tools/FAERS_count_death_related_by_drug.py +49 -0
  151. tooluniverse/tools/FAERS_count_drug_routes_by_event.py +52 -0
  152. tooluniverse/tools/FAERS_count_drugs_by_drug_event.py +63 -0
  153. tooluniverse/tools/FAERS_count_outcomes_by_drug_event.py +63 -0
  154. tooluniverse/tools/FAERS_count_patient_age_distribution.py +49 -0
  155. tooluniverse/tools/FAERS_count_reactions_by_drug_event.py +71 -0
  156. tooluniverse/tools/FAERS_count_reportercountry_by_drug_event.py +63 -0
  157. tooluniverse/tools/FAERS_count_seriousness_by_drug_event.py +63 -0
  158. tooluniverse/tools/FDA_get_abuse_dependence_info_by_drug_name.py +55 -0
  159. tooluniverse/tools/FDA_get_abuse_info_by_drug_name.py +55 -0
  160. tooluniverse/tools/FDA_get_accessories_info_by_drug_name.py +55 -0
  161. tooluniverse/tools/FDA_get_active_ingredient_info_by_drug_name.py +55 -0
  162. tooluniverse/tools/FDA_get_adverse_reactions_by_drug_name.py +55 -0
  163. tooluniverse/tools/FDA_get_alarms_by_drug_name.py +55 -0
  164. tooluniverse/tools/FDA_get_animal_pharmacology_info_by_drug_name.py +55 -0
  165. tooluniverse/tools/FDA_get_assembly_installation_info_by_drug_name.py +55 -0
  166. tooluniverse/tools/FDA_get_boxed_warning_info_by_drug_name.py +55 -0
  167. tooluniverse/tools/FDA_get_brand_name_generic_name.py +52 -0
  168. tooluniverse/tools/FDA_get_calibration_instructions_by_drug_name.py +55 -0
  169. tooluniverse/tools/FDA_get_carcinogenic_mutagenic_fertility_by_drug_name.py +55 -0
  170. tooluniverse/tools/FDA_get_child_safety_info_by_drug_name.py +55 -0
  171. tooluniverse/tools/FDA_get_clinical_pharmacology_by_drug_name.py +55 -0
  172. tooluniverse/tools/FDA_get_clinical_studies_info_by_drug_name.py +55 -0
  173. tooluniverse/tools/FDA_get_contact_for_questions_info_by_drug_name.py +55 -0
  174. tooluniverse/tools/FDA_get_contraindications_by_drug_name.py +55 -0
  175. tooluniverse/tools/FDA_get_controlled_substance_DEA_schedule_info_by_drug_name.py +55 -0
  176. tooluniverse/tools/FDA_get_dear_health_care_provider_letter_info_by_drug_name.py +55 -0
  177. tooluniverse/tools/FDA_get_dependence_info_by_drug_name.py +55 -0
  178. tooluniverse/tools/FDA_get_disposal_info_by_drug_name.py +55 -0
  179. tooluniverse/tools/FDA_get_do_not_use_info_by_drug_name.py +55 -0
  180. tooluniverse/tools/FDA_get_document_id_by_drug_name.py +55 -0
  181. tooluniverse/tools/FDA_get_dosage_and_storage_information_by_drug_name.py +55 -0
  182. tooluniverse/tools/FDA_get_dosage_forms_and_strengths_by_drug_name.py +55 -0
  183. tooluniverse/tools/FDA_get_drug_generic_name.py +46 -0
  184. tooluniverse/tools/FDA_get_drug_interactions_by_drug_name.py +55 -0
  185. tooluniverse/tools/FDA_get_drug_name_by_SPL_ID.py +55 -0
  186. tooluniverse/tools/FDA_get_drug_name_by_adverse_reaction.py +59 -0
  187. tooluniverse/tools/FDA_get_drug_name_by_calibration_instructions.py +59 -0
  188. tooluniverse/tools/FDA_get_drug_name_by_dependence_info.py +59 -0
  189. tooluniverse/tools/FDA_get_drug_name_by_document_id.py +55 -0
  190. tooluniverse/tools/FDA_get_drug_name_by_dosage_info.py +55 -0
  191. tooluniverse/tools/FDA_get_drug_name_by_environmental_warning.py +59 -0
  192. tooluniverse/tools/FDA_get_drug_name_by_inactive_ingredient.py +59 -0
  193. tooluniverse/tools/FDA_get_drug_name_by_info_on_conditions_for_doctor_consultation.py +55 -0
  194. tooluniverse/tools/FDA_get_drug_name_by_labor_and_delivery_info.py +59 -0
  195. tooluniverse/tools/FDA_get_drug_name_by_microbiology.py +59 -0
  196. tooluniverse/tools/FDA_get_drug_name_by_other_safety_info.py +55 -0
  197. tooluniverse/tools/FDA_get_drug_name_by_pharmacodynamics.py +59 -0
  198. tooluniverse/tools/FDA_get_drug_name_by_pharmacogenomics.py +59 -0
  199. tooluniverse/tools/FDA_get_drug_name_by_precautions.py +55 -0
  200. tooluniverse/tools/FDA_get_drug_name_by_pregnancy_or_breastfeeding_info.py +59 -0
  201. tooluniverse/tools/FDA_get_drug_name_by_principal_display_panel.py +59 -0
  202. tooluniverse/tools/FDA_get_drug_name_by_reference.py +55 -0
  203. tooluniverse/tools/FDA_get_drug_name_by_set_id.py +55 -0
  204. tooluniverse/tools/FDA_get_drug_name_by_stop_use_info.py +55 -0
  205. tooluniverse/tools/FDA_get_drug_name_by_storage_and_handling_info.py +55 -0
  206. tooluniverse/tools/FDA_get_drug_name_by_warnings.py +55 -0
  207. tooluniverse/tools/FDA_get_drug_name_from_patient_package_insert.py +59 -0
  208. tooluniverse/tools/FDA_get_drug_names_by_abuse_dependence_info.py +55 -0
  209. tooluniverse/tools/FDA_get_drug_names_by_abuse_info.py +63 -0
  210. tooluniverse/tools/FDA_get_drug_names_by_accessories.py +63 -0
  211. tooluniverse/tools/FDA_get_drug_names_by_active_ingredient.py +63 -0
  212. tooluniverse/tools/FDA_get_drug_names_by_alarm.py +63 -0
  213. tooluniverse/tools/FDA_get_drug_names_by_animal_pharmacology_info.py +63 -0
  214. tooluniverse/tools/FDA_get_drug_names_by_application_number_NDC_number.py +59 -0
  215. tooluniverse/tools/FDA_get_drug_names_by_assembly_installation_info.py +63 -0
  216. tooluniverse/tools/FDA_get_drug_names_by_boxed_warning.py +63 -0
  217. tooluniverse/tools/FDA_get_drug_names_by_child_safety_info.py +63 -0
  218. tooluniverse/tools/FDA_get_drug_names_by_clinical_pharmacology.py +63 -0
  219. tooluniverse/tools/FDA_get_drug_names_by_clinical_studies.py +63 -0
  220. tooluniverse/tools/FDA_get_drug_names_by_consulting_doctor_pharmacist_info.py +63 -0
  221. tooluniverse/tools/FDA_get_drug_names_by_contraindications.py +63 -0
  222. tooluniverse/tools/FDA_get_drug_names_by_controlled_substance_DEA_schedule.py +63 -0
  223. tooluniverse/tools/FDA_get_drug_names_by_dear_health_care_provider_letter_info.py +63 -0
  224. tooluniverse/tools/FDA_get_drug_names_by_disposal_info.py +63 -0
  225. tooluniverse/tools/FDA_get_drug_names_by_dosage_forms_and_strengths_info.py +63 -0
  226. tooluniverse/tools/FDA_get_drug_names_by_drug_interactions.py +63 -0
  227. tooluniverse/tools/FDA_get_drug_names_by_effective_time.py +63 -0
  228. tooluniverse/tools/FDA_get_drug_names_by_food_safety_warnings.py +63 -0
  229. tooluniverse/tools/FDA_get_drug_names_by_general_precautions.py +63 -0
  230. tooluniverse/tools/FDA_get_drug_names_by_geriatric_use.py +63 -0
  231. tooluniverse/tools/FDA_get_drug_names_by_health_claim.py +63 -0
  232. tooluniverse/tools/FDA_get_drug_names_by_indication.py +55 -0
  233. tooluniverse/tools/FDA_get_drug_names_by_info_for_nursing_mothers.py +63 -0
  234. tooluniverse/tools/FDA_get_drug_names_by_information_for_owners_or_caregivers.py +63 -0
  235. tooluniverse/tools/FDA_get_drug_names_by_ingredient.py +63 -0
  236. tooluniverse/tools/FDA_get_drug_names_by_instructions_for_use.py +63 -0
  237. tooluniverse/tools/FDA_get_drug_names_by_lab_test_interference.py +63 -0
  238. tooluniverse/tools/FDA_get_drug_names_by_lab_tests.py +63 -0
  239. tooluniverse/tools/FDA_get_drug_names_by_mechanism_of_action.py +63 -0
  240. tooluniverse/tools/FDA_get_drug_names_by_medication_guide.py +63 -0
  241. tooluniverse/tools/FDA_get_drug_names_by_nonclinical_toxicology_info.py +63 -0
  242. tooluniverse/tools/FDA_get_drug_names_by_nonteratogenic_effects.py +63 -0
  243. tooluniverse/tools/FDA_get_drug_names_by_overdosage_info.py +63 -0
  244. tooluniverse/tools/FDA_get_drug_names_by_pediatric_use.py +63 -0
  245. tooluniverse/tools/FDA_get_drug_names_by_pharmacokinetics.py +63 -0
  246. tooluniverse/tools/FDA_get_drug_names_by_population_use.py +63 -0
  247. tooluniverse/tools/FDA_get_drug_names_by_pregnancy_effects_info.py +63 -0
  248. tooluniverse/tools/FDA_get_drug_names_by_residue_warning.py +63 -0
  249. tooluniverse/tools/FDA_get_drug_names_by_risk.py +63 -0
  250. tooluniverse/tools/FDA_get_drug_names_by_route.py +63 -0
  251. tooluniverse/tools/FDA_get_drug_names_by_safe_handling_warning.py +63 -0
  252. tooluniverse/tools/FDA_get_drug_names_by_safety_summary.py +63 -0
  253. tooluniverse/tools/FDA_get_drug_names_by_spl_indexing_data_elements.py +63 -0
  254. tooluniverse/tools/FDA_get_drug_names_by_teratogenic_effects.py +63 -0
  255. tooluniverse/tools/FDA_get_drug_names_by_user_safety_warning.py +63 -0
  256. tooluniverse/tools/FDA_get_drug_names_by_warnings_and_cautions.py +63 -0
  257. tooluniverse/tools/FDA_get_drugs_by_carcinogenic_mutagenic_fertility.py +63 -0
  258. tooluniverse/tools/FDA_get_effective_time_by_drug_name.py +55 -0
  259. tooluniverse/tools/FDA_get_environmental_warning_by_drug_name.py +55 -0
  260. tooluniverse/tools/FDA_get_general_precautions_by_drug_name.py +55 -0
  261. tooluniverse/tools/FDA_get_geriatric_use_info_by_drug_name.py +55 -0
  262. tooluniverse/tools/FDA_get_health_claims_by_drug_name.py +55 -0
  263. tooluniverse/tools/FDA_get_inactive_ingredient_info_by_drug_name.py +55 -0
  264. tooluniverse/tools/FDA_get_indications_by_drug_name.py +55 -0
  265. tooluniverse/tools/FDA_get_info_for_nursing_mothers_by_drug_name.py +55 -0
  266. tooluniverse/tools/FDA_get_info_for_patients_by_drug_name.py +55 -0
  267. tooluniverse/tools/FDA_get_info_on_conditions_for_doctor_consultation_by_drug_name.py +55 -0
  268. tooluniverse/tools/FDA_get_info_on_consulting_doctor_pharmacist_by_drug_name.py +55 -0
  269. tooluniverse/tools/FDA_get_information_for_owners_or_caregivers_by_drug_name.py +55 -0
  270. tooluniverse/tools/FDA_get_ingredients_by_drug_name.py +55 -0
  271. tooluniverse/tools/FDA_get_instructions_for_use_by_drug_name.py +55 -0
  272. tooluniverse/tools/FDA_get_lab_test_interference_info_by_drug_name.py +55 -0
  273. tooluniverse/tools/FDA_get_lab_tests_by_drug_name.py +55 -0
  274. tooluniverse/tools/FDA_get_labor_and_delivery_info_by_drug_name.py +55 -0
  275. tooluniverse/tools/FDA_get_manufacturer_name_NDC_number_by_drug_name.py +55 -0
  276. tooluniverse/tools/FDA_get_mechanism_of_action_by_drug_name.py +55 -0
  277. tooluniverse/tools/FDA_get_medication_guide_info_by_drug_name.py +55 -0
  278. tooluniverse/tools/FDA_get_microbiology_info_by_drug_name.py +55 -0
  279. tooluniverse/tools/FDA_get_nonclinical_toxicology_info_by_drug_name.py +55 -0
  280. tooluniverse/tools/FDA_get_nonteratogenic_effects_by_drug_name.py +55 -0
  281. tooluniverse/tools/FDA_get_other_safety_info_by_drug_name.py +55 -0
  282. tooluniverse/tools/FDA_get_overdosage_info_by_drug_name.py +55 -0
  283. tooluniverse/tools/FDA_get_patient_package_insert_from_drug_name.py +55 -0
  284. tooluniverse/tools/FDA_get_pediatric_use_info_by_drug_name.py +55 -0
  285. tooluniverse/tools/FDA_get_pharmacodynamics_by_drug_name.py +55 -0
  286. tooluniverse/tools/FDA_get_pharmacogenomics_info_by_drug_name.py +55 -0
  287. tooluniverse/tools/FDA_get_pharmacokinetics_by_drug_name.py +55 -0
  288. tooluniverse/tools/FDA_get_population_use_info_by_drug_name.py +55 -0
  289. tooluniverse/tools/FDA_get_precautions_by_drug_name.py +55 -0
  290. tooluniverse/tools/FDA_get_pregnancy_effects_info_by_drug_name.py +55 -0
  291. tooluniverse/tools/FDA_get_pregnancy_or_breastfeeding_info_by_drug_name.py +55 -0
  292. tooluniverse/tools/FDA_get_principal_display_panel_by_drug_name.py +55 -0
  293. tooluniverse/tools/FDA_get_purpose_info_by_drug_name.py +55 -0
  294. tooluniverse/tools/FDA_get_recent_changes_by_drug_name.py +55 -0
  295. tooluniverse/tools/FDA_get_reference_info_by_drug_name.py +55 -0
  296. tooluniverse/tools/FDA_get_residue_warning_by_drug_name.py +55 -0
  297. tooluniverse/tools/FDA_get_risk_info_by_drug_name.py +55 -0
  298. tooluniverse/tools/FDA_get_route_info_by_drug_name.py +55 -0
  299. tooluniverse/tools/FDA_get_safe_handling_warnings_by_drug_name.py +55 -0
  300. tooluniverse/tools/FDA_get_safety_summary_by_drug_name.py +55 -0
  301. tooluniverse/tools/FDA_get_spl_indexing_data_elements_by_drug_name.py +55 -0
  302. tooluniverse/tools/FDA_get_spl_unclassified_section_by_drug_name.py +55 -0
  303. tooluniverse/tools/FDA_get_stop_use_info_by_drug_name.py +55 -0
  304. tooluniverse/tools/FDA_get_storage_and_handling_info_by_drug_name.py +55 -0
  305. tooluniverse/tools/FDA_get_teratogenic_effects_by_drug_name.py +55 -0
  306. tooluniverse/tools/FDA_get_user_safety_warning_by_drug_names.py +55 -0
  307. tooluniverse/tools/FDA_get_warnings_and_cautions_by_drug_name.py +55 -0
  308. tooluniverse/tools/FDA_get_warnings_by_drug_name.py +55 -0
  309. tooluniverse/tools/FDA_get_when_using_info.py +55 -0
  310. tooluniverse/tools/FDA_retrieve_device_use_by_drug_name.py +55 -0
  311. tooluniverse/tools/FDA_retrieve_drug_name_by_device_use.py +59 -0
  312. tooluniverse/tools/FDA_retrieve_drug_names_by_patient_medication_info.py +55 -0
  313. tooluniverse/tools/FDA_retrieve_patient_medication_info_by_drug_name.py +55 -0
  314. tooluniverse/tools/Fatcat_search_scholar.py +52 -0
  315. tooluniverse/tools/Finish.py +44 -0
  316. tooluniverse/tools/GO_get_annotations_for_gene.py +46 -0
  317. tooluniverse/tools/GO_get_genes_for_term.py +55 -0
  318. tooluniverse/tools/GO_get_term_by_id.py +46 -0
  319. tooluniverse/tools/GO_get_term_details.py +46 -0
  320. tooluniverse/tools/GO_search_terms.py +46 -0
  321. tooluniverse/tools/HAL_search_archive.py +52 -0
  322. tooluniverse/tools/HPA_get_biological_processes_by_gene.py +52 -0
  323. tooluniverse/tools/HPA_get_cancer_prognostics_by_gene.py +49 -0
  324. tooluniverse/tools/HPA_get_comparative_expression_by_gene_and_cellline.py +52 -0
  325. tooluniverse/tools/HPA_get_comprehensive_gene_details_by_ensembl_id.py +63 -0
  326. tooluniverse/tools/HPA_get_contextual_biological_process_analysis.py +52 -0
  327. tooluniverse/tools/HPA_get_disease_expression_by_gene_tissue_disease.py +59 -0
  328. tooluniverse/tools/HPA_get_gene_basic_info_by_ensembl_id.py +49 -0
  329. tooluniverse/tools/HPA_get_gene_tsv_data_by_ensembl_id.py +49 -0
  330. tooluniverse/tools/HPA_get_protein_interactions_by_gene.py +49 -0
  331. tooluniverse/tools/HPA_get_rna_expression_by_source.py +59 -0
  332. tooluniverse/tools/HPA_get_rna_expression_in_specific_tissues.py +52 -0
  333. tooluniverse/tools/HPA_get_subcellular_location.py +46 -0
  334. tooluniverse/tools/HPA_search_genes_by_query.py +49 -0
  335. tooluniverse/tools/HypothesisGenerator.py +63 -0
  336. tooluniverse/tools/LabelGenerator.py +67 -0
  337. tooluniverse/tools/LiteratureContextReviewer.py +55 -0
  338. tooluniverse/tools/LiteratureSearchTool.py +49 -0
  339. tooluniverse/tools/MedRxiv_search_preprints.py +52 -0
  340. tooluniverse/tools/MedicalLiteratureReviewer.py +71 -0
  341. tooluniverse/tools/MedicalTermNormalizer.py +46 -0
  342. tooluniverse/tools/MedlinePlus_connect_lookup_by_code.py +67 -0
  343. tooluniverse/tools/MedlinePlus_get_genetics_condition_by_name.py +52 -0
  344. tooluniverse/tools/MedlinePlus_get_genetics_gene_by_name.py +52 -0
  345. tooluniverse/tools/MedlinePlus_get_genetics_index.py +44 -0
  346. tooluniverse/tools/MedlinePlus_search_topics_by_keyword.py +55 -0
  347. tooluniverse/tools/MethodologyRigorReviewer.py +49 -0
  348. tooluniverse/tools/MultiAgentLiteratureSearch.py +59 -0
  349. tooluniverse/tools/NICE_Clinical_Guidelines_Search.py +52 -0
  350. tooluniverse/tools/NICE_Guideline_Full_Text.py +46 -0
  351. tooluniverse/tools/NoveltySignificanceReviewer.py +59 -0
  352. tooluniverse/tools/OSF_search_preprints.py +59 -0
  353. tooluniverse/tools/OSL_get_efo_id_by_disease_name.py +46 -0
  354. tooluniverse/tools/OpenAIRE_search_publications.py +55 -0
  355. tooluniverse/tools/OpenAlex_Guidelines_Search.py +63 -0
  356. tooluniverse/tools/OpenTargets_drug_pharmacogenomics_data.py +52 -0
  357. tooluniverse/tools/OpenTargets_get_approved_indications_by_drug_chemblId.py +49 -0
  358. tooluniverse/tools/OpenTargets_get_associated_diseases_by_drug_chemblId.py +49 -0
  359. tooluniverse/tools/OpenTargets_get_associated_drugs_by_disease_efoId.py +52 -0
  360. tooluniverse/tools/OpenTargets_get_associated_drugs_by_target_ensemblID.py +55 -0
  361. tooluniverse/tools/OpenTargets_get_associated_phenotypes_by_disease_efoId.py +49 -0
  362. tooluniverse/tools/OpenTargets_get_associated_targets_by_disease_efoId.py +49 -0
  363. tooluniverse/tools/OpenTargets_get_associated_targets_by_drug_chemblId.py +49 -0
  364. tooluniverse/tools/OpenTargets_get_biological_mouse_models_by_ensemblID.py +49 -0
  365. tooluniverse/tools/OpenTargets_get_chemical_probes_by_target_ensemblID.py +49 -0
  366. tooluniverse/tools/OpenTargets_get_disease_ancestors_parents_by_efoId.py +49 -0
  367. tooluniverse/tools/OpenTargets_get_disease_descendants_children_by_efoId.py +49 -0
  368. tooluniverse/tools/OpenTargets_get_disease_description_by_efoId.py +49 -0
  369. tooluniverse/tools/OpenTargets_get_disease_id_description_by_name.py +49 -0
  370. tooluniverse/tools/OpenTargets_get_disease_ids_by_efoId.py +46 -0
  371. tooluniverse/tools/OpenTargets_get_disease_ids_by_name.py +46 -0
  372. tooluniverse/tools/OpenTargets_get_disease_locations_by_efoId.py +49 -0
  373. tooluniverse/tools/OpenTargets_get_disease_synonyms_by_efoId.py +49 -0
  374. tooluniverse/tools/OpenTargets_get_disease_therapeutic_areas_by_efoId.py +49 -0
  375. tooluniverse/tools/OpenTargets_get_diseases_phenotypes_by_target_ensembl.py +49 -0
  376. tooluniverse/tools/OpenTargets_get_drug_adverse_events_by_chemblId.py +52 -0
  377. tooluniverse/tools/OpenTargets_get_drug_approval_status_by_chemblId.py +49 -0
  378. tooluniverse/tools/OpenTargets_get_drug_chembId_by_generic_name.py +49 -0
  379. tooluniverse/tools/OpenTargets_get_drug_description_by_chemblId.py +49 -0
  380. tooluniverse/tools/OpenTargets_get_drug_id_description_by_name.py +49 -0
  381. tooluniverse/tools/OpenTargets_get_drug_indications_by_chemblId.py +49 -0
  382. tooluniverse/tools/OpenTargets_get_drug_mechanisms_of_action_by_chemblId.py +49 -0
  383. tooluniverse/tools/OpenTargets_get_drug_synonyms_by_chemblId.py +49 -0
  384. tooluniverse/tools/OpenTargets_get_drug_trade_names_by_chemblId.py +49 -0
  385. tooluniverse/tools/OpenTargets_get_drug_warnings_by_chemblId.py +49 -0
  386. tooluniverse/tools/OpenTargets_get_drug_withdrawn_blackbox_status_by_chemblId.py +49 -0
  387. tooluniverse/tools/OpenTargets_get_gene_ontology_terms_by_goID.py +49 -0
  388. tooluniverse/tools/OpenTargets_get_known_drugs_by_drug_chemblId.py +49 -0
  389. tooluniverse/tools/OpenTargets_get_parent_child_molecules_by_drug_chembl_ID.py +49 -0
  390. tooluniverse/tools/OpenTargets_get_publications_by_disease_efoId.py +71 -0
  391. tooluniverse/tools/OpenTargets_get_publications_by_drug_chemblId.py +71 -0
  392. tooluniverse/tools/OpenTargets_get_publications_by_target_ensemblID.py +71 -0
  393. tooluniverse/tools/OpenTargets_get_similar_entities_by_disease_efoId.py +55 -0
  394. tooluniverse/tools/OpenTargets_get_similar_entities_by_drug_chemblId.py +55 -0
  395. tooluniverse/tools/OpenTargets_get_similar_entities_by_target_ensemblID.py +55 -0
  396. tooluniverse/tools/OpenTargets_get_target_classes_by_ensemblID.py +49 -0
  397. tooluniverse/tools/OpenTargets_get_target_constraint_info_by_ensemblID.py +49 -0
  398. tooluniverse/tools/OpenTargets_get_target_enabling_packages_by_ensemblID.py +49 -0
  399. tooluniverse/tools/OpenTargets_get_target_gene_ontology_by_ensemblID.py +49 -0
  400. tooluniverse/tools/OpenTargets_get_target_genomic_location_by_ensemblID.py +49 -0
  401. tooluniverse/tools/OpenTargets_get_target_homologues_by_ensemblID.py +49 -0
  402. tooluniverse/tools/OpenTargets_get_target_id_description_by_name.py +49 -0
  403. tooluniverse/tools/OpenTargets_get_target_interactions_by_ensemblID.py +52 -0
  404. tooluniverse/tools/OpenTargets_get_target_safety_profile_by_ensemblID.py +49 -0
  405. tooluniverse/tools/OpenTargets_get_target_subcellular_locations_by_ensemblID.py +49 -0
  406. tooluniverse/tools/OpenTargets_get_target_synonyms_by_ensemblID.py +49 -0
  407. tooluniverse/tools/OpenTargets_get_target_tractability_by_ensemblID.py +49 -0
  408. tooluniverse/tools/OpenTargets_map_any_disease_id_to_all_other_ids.py +49 -0
  409. tooluniverse/tools/OpenTargets_multi_entity_search_by_query_string.py +59 -0
  410. tooluniverse/tools/OpenTargets_search_category_counts_by_query_string.py +49 -0
  411. tooluniverse/tools/OpenTargets_target_disease_evidence.py +52 -0
  412. tooluniverse/tools/OutputSummarizationComposer.py +71 -0
  413. tooluniverse/tools/PMC_search_papers.py +67 -0
  414. tooluniverse/tools/ProtocolOptimizer.py +49 -0
  415. tooluniverse/tools/PubChem_get_CID_by_SMILES.py +46 -0
  416. tooluniverse/tools/PubChem_get_CID_by_compound_name.py +46 -0
  417. tooluniverse/tools/PubChem_get_associated_patents_by_CID.py +46 -0
  418. tooluniverse/tools/PubChem_get_compound_2D_image_by_CID.py +52 -0
  419. tooluniverse/tools/PubChem_get_compound_properties_by_CID.py +46 -0
  420. tooluniverse/tools/PubChem_get_compound_synonyms_by_CID.py +46 -0
  421. tooluniverse/tools/PubChem_get_compound_xrefs_by_CID.py +52 -0
  422. tooluniverse/tools/PubChem_search_compounds_by_similarity.py +52 -0
  423. tooluniverse/tools/PubChem_search_compounds_by_substructure.py +49 -0
  424. tooluniverse/tools/PubMed_Guidelines_Search.py +55 -0
  425. tooluniverse/tools/PubMed_search_articles.py +55 -0
  426. tooluniverse/tools/PubTator3_EntityAutocomplete.py +59 -0
  427. tooluniverse/tools/PubTator3_LiteratureSearch.py +55 -0
  428. tooluniverse/tools/QuestionRephraser.py +52 -0
  429. tooluniverse/tools/Reactome_get_pathway_reactions.py +46 -0
  430. tooluniverse/tools/ReproducibilityTransparencyReviewer.py +49 -0
  431. tooluniverse/tools/ResultsInterpretationReviewer.py +55 -0
  432. tooluniverse/tools/ScientificTextSummarizer.py +59 -0
  433. tooluniverse/tools/SemanticScholar_search_papers.py +55 -0
  434. tooluniverse/tools/TRIP_Database_Guidelines_Search.py +55 -0
  435. tooluniverse/tools/TestCaseGenerator.py +46 -0
  436. tooluniverse/tools/ToolCompatibilityAnalyzer.py +59 -0
  437. tooluniverse/tools/ToolDescriptionOptimizer.py +67 -0
  438. tooluniverse/tools/ToolDiscover.py +63 -0
  439. tooluniverse/tools/ToolGraphComposer.py +71 -0
  440. tooluniverse/tools/ToolGraphGenerationPipeline.py +63 -0
  441. tooluniverse/tools/ToolImplementationGenerator.py +67 -0
  442. tooluniverse/tools/ToolMetadataGenerationPipeline.py +63 -0
  443. tooluniverse/tools/ToolMetadataGenerator.py +55 -0
  444. tooluniverse/tools/ToolMetadataStandardizer.py +52 -0
  445. tooluniverse/tools/ToolOptimizer.py +59 -0
  446. tooluniverse/tools/ToolOutputSummarizer.py +67 -0
  447. tooluniverse/tools/ToolQualityEvaluator.py +59 -0
  448. tooluniverse/tools/ToolRelationshipDetector.py +52 -0
  449. tooluniverse/tools/ToolSpecificationGenerator.py +67 -0
  450. tooluniverse/tools/ToolSpecificationOptimizer.py +63 -0
  451. tooluniverse/tools/Tool_Finder.py +67 -0
  452. tooluniverse/tools/Tool_Finder_Keyword.py +67 -0
  453. tooluniverse/tools/Tool_Finder_LLM.py +67 -0
  454. tooluniverse/tools/Tool_RAG.py +49 -0
  455. tooluniverse/tools/UniProt_get_alternative_names_by_accession.py +49 -0
  456. tooluniverse/tools/UniProt_get_disease_variants_by_accession.py +49 -0
  457. tooluniverse/tools/UniProt_get_entry_by_accession.py +49 -0
  458. tooluniverse/tools/UniProt_get_function_by_accession.py +49 -0
  459. tooluniverse/tools/UniProt_get_isoform_ids_by_accession.py +49 -0
  460. tooluniverse/tools/UniProt_get_organism_by_accession.py +49 -0
  461. tooluniverse/tools/UniProt_get_ptm_processing_by_accession.py +49 -0
  462. tooluniverse/tools/UniProt_get_recommended_name_by_accession.py +49 -0
  463. tooluniverse/tools/UniProt_get_sequence_by_accession.py +49 -0
  464. tooluniverse/tools/UniProt_get_subcellular_location_by_accession.py +49 -0
  465. tooluniverse/tools/Unpaywall_check_oa_status.py +52 -0
  466. tooluniverse/tools/WHO_Guideline_Full_Text.py +46 -0
  467. tooluniverse/tools/WHO_Guidelines_Search.py +52 -0
  468. tooluniverse/tools/Wikidata_SPARQL_query.py +52 -0
  469. tooluniverse/tools/WritingPresentationReviewer.py +49 -0
  470. tooluniverse/tools/Zenodo_search_records.py +59 -0
  471. tooluniverse/tools/__init__.py +1738 -0
  472. tooluniverse/tools/_shared_client.py +138 -0
  473. tooluniverse/tools/alphafold_get_annotations.py +52 -0
  474. tooluniverse/tools/alphafold_get_prediction.py +55 -0
  475. tooluniverse/tools/alphafold_get_summary.py +46 -0
  476. tooluniverse/tools/call_agentic_human.py +46 -0
  477. tooluniverse/tools/cancer_biomarkers_disease_target_score.py +52 -0
  478. tooluniverse/tools/cancer_gene_census_disease_target_score.py +52 -0
  479. tooluniverse/tools/cellosaurus_get_cell_line_info.py +55 -0
  480. tooluniverse/tools/cellosaurus_query_converter.py +52 -0
  481. tooluniverse/tools/cellosaurus_search_cell_lines.py +55 -0
  482. tooluniverse/tools/chembl_disease_target_score.py +52 -0
  483. tooluniverse/tools/dict_search.py +67 -0
  484. tooluniverse/tools/dili_search.py +67 -0
  485. tooluniverse/tools/diqt_search.py +67 -0
  486. tooluniverse/tools/disease_target_score.py +59 -0
  487. tooluniverse/tools/drugbank_filter_drugs_by_name.py +55 -0
  488. tooluniverse/tools/drugbank_full_search.py +67 -0
  489. tooluniverse/tools/drugbank_get_drug_basic_info_by_drug_name_or_drugbank_id.py +63 -0
  490. tooluniverse/tools/drugbank_get_drug_chemistry_by_drug_name_or_drugbank_id.py +63 -0
  491. tooluniverse/tools/drugbank_get_drug_interactions_by_drug_name_or_drugbank_id.py +63 -0
  492. tooluniverse/tools/drugbank_get_drug_name_and_description_by_indication.py +63 -0
  493. tooluniverse/tools/drugbank_get_drug_name_and_description_by_pathway_name.py +63 -0
  494. tooluniverse/tools/drugbank_get_drug_name_and_description_by_target_name.py +63 -0
  495. tooluniverse/tools/drugbank_get_drug_name_description_pharmacology_by_mechanism_of_action.py +63 -0
  496. tooluniverse/tools/drugbank_get_drug_pathways_and_reactions_by_drug_name_or_drugbank_id.py +63 -0
  497. tooluniverse/tools/drugbank_get_drug_products_by_name_or_drugbank_id.py +63 -0
  498. tooluniverse/tools/drugbank_get_drug_references_by_drug_name_or_drugbank_id.py +63 -0
  499. tooluniverse/tools/drugbank_get_indications_by_drug_name_or_drugbank_id.py +63 -0
  500. tooluniverse/tools/drugbank_get_pharmacology_by_drug_name_or_drugbank_id.py +63 -0
  501. tooluniverse/tools/drugbank_get_safety_by_drug_name_or_drugbank_id.py +63 -0
  502. tooluniverse/tools/drugbank_get_targets_by_drug_name_or_drugbank_id.py +63 -0
  503. tooluniverse/tools/drugbank_links_search.py +67 -0
  504. tooluniverse/tools/drugbank_vocab_filter.py +63 -0
  505. tooluniverse/tools/drugbank_vocab_search.py +67 -0
  506. tooluniverse/tools/embedding_database_add.py +63 -0
  507. tooluniverse/tools/embedding_database_create.py +71 -0
  508. tooluniverse/tools/embedding_database_load.py +63 -0
  509. tooluniverse/tools/embedding_database_search.py +67 -0
  510. tooluniverse/tools/embedding_sync_download.py +63 -0
  511. tooluniverse/tools/embedding_sync_upload.py +71 -0
  512. tooluniverse/tools/enrichr_gene_enrichment_analysis.py +52 -0
  513. tooluniverse/tools/europepmc_disease_target_score.py +52 -0
  514. tooluniverse/tools/eva_disease_target_score.py +52 -0
  515. tooluniverse/tools/eva_somatic_disease_target_score.py +52 -0
  516. tooluniverse/tools/expression_atlas_disease_target_score.py +52 -0
  517. tooluniverse/tools/extract_clinical_trial_adverse_events.py +59 -0
  518. tooluniverse/tools/extract_clinical_trial_outcomes.py +52 -0
  519. tooluniverse/tools/genomics_england_disease_target_score.py +52 -0
  520. tooluniverse/tools/get_HPO_ID_by_phenotype.py +55 -0
  521. tooluniverse/tools/get_albumentations_info.py +44 -0
  522. tooluniverse/tools/get_altair_info.py +44 -0
  523. tooluniverse/tools/get_anndata_info.py +49 -0
  524. tooluniverse/tools/get_arboreto_info.py +46 -0
  525. tooluniverse/tools/get_arxiv_info.py +46 -0
  526. tooluniverse/tools/get_ase_info.py +46 -0
  527. tooluniverse/tools/get_assembly_info_by_pdb_id.py +46 -0
  528. tooluniverse/tools/get_assembly_summary.py +46 -0
  529. tooluniverse/tools/get_astropy_info.py +44 -0
  530. tooluniverse/tools/get_binding_affinity_by_pdb_id.py +46 -0
  531. tooluniverse/tools/get_biopandas_info.py +49 -0
  532. tooluniverse/tools/get_biopython_info.py +49 -0
  533. tooluniverse/tools/get_bioservices_info.py +44 -0
  534. tooluniverse/tools/get_biotite_info.py +49 -0
  535. tooluniverse/tools/get_bokeh_info.py +44 -0
  536. tooluniverse/tools/get_brian2_info.py +44 -0
  537. tooluniverse/tools/get_cartopy_info.py +44 -0
  538. tooluniverse/tools/get_catboost_info.py +44 -0
  539. tooluniverse/tools/get_cellpose_info.py +49 -0
  540. tooluniverse/tools/get_cellrank_info.py +44 -0
  541. tooluniverse/tools/get_cellxgene_census_info.py +46 -0
  542. tooluniverse/tools/get_cftime_info.py +44 -0
  543. tooluniverse/tools/get_chem_comp_audit_info.py +46 -0
  544. tooluniverse/tools/get_chem_comp_charge_and_ambiguity.py +46 -0
  545. tooluniverse/tools/get_chembl_webresource_client_info.py +44 -0
  546. tooluniverse/tools/get_citation_info_by_pdb_id.py +46 -0
  547. tooluniverse/tools/get_clair3_info.py +46 -0
  548. tooluniverse/tools/get_clinical_trial_conditions_and_interventions.py +55 -0
  549. tooluniverse/tools/get_clinical_trial_descriptions.py +52 -0
  550. tooluniverse/tools/get_clinical_trial_eligibility_criteria.py +55 -0
  551. tooluniverse/tools/get_clinical_trial_locations.py +52 -0
  552. tooluniverse/tools/get_clinical_trial_outcome_measures.py +52 -0
  553. tooluniverse/tools/get_clinical_trial_references.py +52 -0
  554. tooluniverse/tools/get_clinical_trial_status_and_dates.py +52 -0
  555. tooluniverse/tools/get_cobra_info.py +46 -0
  556. tooluniverse/tools/get_cobrapy_info.py +46 -0
  557. tooluniverse/tools/get_cooler_info.py +49 -0
  558. tooluniverse/tools/get_core_refinement_statistics.py +46 -0
  559. tooluniverse/tools/get_cryosparc_tools_info.py +46 -0
  560. tooluniverse/tools/get_crystal_growth_conditions_by_pdb_id.py +49 -0
  561. tooluniverse/tools/get_crystallization_ph_by_pdb_id.py +46 -0
  562. tooluniverse/tools/get_crystallographic_properties_by_pdb_id.py +49 -0
  563. tooluniverse/tools/get_cupy_info.py +44 -0
  564. tooluniverse/tools/get_cyvcf2_info.py +49 -0
  565. tooluniverse/tools/get_dask_info.py +44 -0
  566. tooluniverse/tools/get_datamol_info.py +44 -0
  567. tooluniverse/tools/get_datashader_info.py +44 -0
  568. tooluniverse/tools/get_deepchem_info.py +49 -0
  569. tooluniverse/tools/get_deeppurpose_info.py +46 -0
  570. tooluniverse/tools/get_deeptools_info.py +46 -0
  571. tooluniverse/tools/get_deepxde_info.py +49 -0
  572. tooluniverse/tools/get_dendropy_info.py +44 -0
  573. tooluniverse/tools/get_descriptastorus_info.py +46 -0
  574. tooluniverse/tools/get_diffdock_info.py +46 -0
  575. tooluniverse/tools/get_dscribe_info.py +49 -0
  576. tooluniverse/tools/get_ec_number_by_entity_id.py +46 -0
  577. tooluniverse/tools/get_elephant_info.py +44 -0
  578. tooluniverse/tools/get_em_3d_fitting_and_reconstruction_details.py +49 -0
  579. tooluniverse/tools/get_emdb_ids_by_pdb_id.py +46 -0
  580. tooluniverse/tools/get_episcanpy_info.py +44 -0
  581. tooluniverse/tools/get_ete3_info.py +44 -0
  582. tooluniverse/tools/get_faiss_info.py +46 -0
  583. tooluniverse/tools/get_fanc_info.py +46 -0
  584. tooluniverse/tools/get_flask_info.py +46 -0
  585. tooluniverse/tools/get_flowio_info.py +46 -0
  586. tooluniverse/tools/get_flowkit_info.py +46 -0
  587. tooluniverse/tools/get_flowutils_info.py +46 -0
  588. tooluniverse/tools/get_freesasa_info.py +44 -0
  589. tooluniverse/tools/get_galpy_info.py +44 -0
  590. tooluniverse/tools/get_gene_name_by_entity_id.py +46 -0
  591. tooluniverse/tools/get_geopandas_info.py +44 -0
  592. tooluniverse/tools/get_gget_info.py +46 -0
  593. tooluniverse/tools/get_googlesearch_python_info.py +46 -0
  594. tooluniverse/tools/get_gseapy_info.py +49 -0
  595. tooluniverse/tools/get_h5py_info.py +46 -0
  596. tooluniverse/tools/get_harmony_pytorch_info.py +46 -0
  597. tooluniverse/tools/get_hmmlearn_info.py +46 -0
  598. tooluniverse/tools/get_holoviews_info.py +44 -0
  599. tooluniverse/tools/get_host_organism_by_pdb_id.py +46 -0
  600. tooluniverse/tools/get_htmd_info.py +44 -0
  601. tooluniverse/tools/get_hyperopt_info.py +49 -0
  602. tooluniverse/tools/get_igraph_info.py +49 -0
  603. tooluniverse/tools/get_imageio_info.py +44 -0
  604. tooluniverse/tools/get_imbalanced_learn_info.py +44 -0
  605. tooluniverse/tools/get_jcvi_info.py +46 -0
  606. tooluniverse/tools/get_joblib_info.py +44 -0
  607. tooluniverse/tools/get_joint_associated_diseases_by_HPO_ID_list.py +55 -0
  608. tooluniverse/tools/get_khmer_info.py +46 -0
  609. tooluniverse/tools/get_kipoiseq_info.py +44 -0
  610. tooluniverse/tools/get_lifelines_info.py +49 -0
  611. tooluniverse/tools/get_ligand_bond_count_by_pdb_id.py +46 -0
  612. tooluniverse/tools/get_ligand_smiles_by_chem_comp_id.py +49 -0
  613. tooluniverse/tools/get_lightgbm_info.py +44 -0
  614. tooluniverse/tools/get_loompy_info.py +46 -0
  615. tooluniverse/tools/get_mageck_info.py +46 -0
  616. tooluniverse/tools/get_matplotlib_info.py +49 -0
  617. tooluniverse/tools/get_mdanalysis_info.py +46 -0
  618. tooluniverse/tools/get_mdtraj_info.py +44 -0
  619. tooluniverse/tools/get_mne_info.py +44 -0
  620. tooluniverse/tools/get_molfeat_info.py +44 -0
  621. tooluniverse/tools/get_molvs_info.py +44 -0
  622. tooluniverse/tools/get_mordred_info.py +44 -0
  623. tooluniverse/tools/get_msprime_info.py +49 -0
  624. tooluniverse/tools/get_mudata_info.py +49 -0
  625. tooluniverse/tools/get_mutation_annotations_by_pdb_id.py +46 -0
  626. tooluniverse/tools/get_neo_info.py +44 -0
  627. tooluniverse/tools/get_netcdf4_info.py +44 -0
  628. tooluniverse/tools/get_networkx_info.py +46 -0
  629. tooluniverse/tools/get_nglview_info.py +44 -0
  630. tooluniverse/tools/get_nilearn_info.py +44 -0
  631. tooluniverse/tools/get_numba_info.py +46 -0
  632. tooluniverse/tools/get_numpy_info.py +46 -0
  633. tooluniverse/tools/get_oligosaccharide_descriptors_by_entity_id.py +49 -0
  634. tooluniverse/tools/get_openbabel_info.py +49 -0
  635. tooluniverse/tools/get_openchem_info.py +46 -0
  636. tooluniverse/tools/get_opencv_info.py +49 -0
  637. tooluniverse/tools/get_openmm_info.py +49 -0
  638. tooluniverse/tools/get_optlang_info.py +46 -0
  639. tooluniverse/tools/get_optuna_info.py +44 -0
  640. tooluniverse/tools/get_palantir_info.py +44 -0
  641. tooluniverse/tools/get_pandas_info.py +49 -0
  642. tooluniverse/tools/get_patsy_info.py +44 -0
  643. tooluniverse/tools/get_pdbfixer_info.py +46 -0
  644. tooluniverse/tools/get_phenotype_by_HPO_ID.py +46 -0
  645. tooluniverse/tools/get_pillow_info.py +44 -0
  646. tooluniverse/tools/get_plantcv_info.py +46 -0
  647. tooluniverse/tools/get_plip_info.py +46 -0
  648. tooluniverse/tools/get_plotly_info.py +44 -0
  649. tooluniverse/tools/get_poliastro_info.py +46 -0
  650. tooluniverse/tools/get_polymer_entity_annotations.py +49 -0
  651. tooluniverse/tools/get_polymer_entity_count_by_pdb_id.py +46 -0
  652. tooluniverse/tools/get_polymer_entity_ids_by_pdb_id.py +46 -0
  653. tooluniverse/tools/get_polymer_entity_type_by_entity_id.py +49 -0
  654. tooluniverse/tools/get_polymer_molecular_weight_by_entity_id.py +49 -0
  655. tooluniverse/tools/get_poretools_info.py +44 -0
  656. tooluniverse/tools/get_prody_info.py +46 -0
  657. tooluniverse/tools/get_protein_classification_by_pdb_id.py +49 -0
  658. tooluniverse/tools/get_protein_metadata_by_pdb_id.py +46 -0
  659. tooluniverse/tools/get_pubchempy_info.py +44 -0
  660. tooluniverse/tools/get_pybedtools_info.py +49 -0
  661. tooluniverse/tools/get_pybigwig_info.py +46 -0
  662. tooluniverse/tools/get_pydeseq2_info.py +46 -0
  663. tooluniverse/tools/get_pyensembl_info.py +44 -0
  664. tooluniverse/tools/get_pyephem_info.py +44 -0
  665. tooluniverse/tools/get_pyfaidx_info.py +49 -0
  666. tooluniverse/tools/get_pyfasta_info.py +44 -0
  667. tooluniverse/tools/get_pykalman_info.py +46 -0
  668. tooluniverse/tools/get_pyliftover_info.py +49 -0
  669. tooluniverse/tools/get_pymassspec_info.py +46 -0
  670. tooluniverse/tools/get_pymed_info.py +46 -0
  671. tooluniverse/tools/get_pymzml_info.py +46 -0
  672. tooluniverse/tools/get_pypdf2_info.py +46 -0
  673. tooluniverse/tools/get_pyranges_info.py +49 -0
  674. tooluniverse/tools/get_pyrosetta_info.py +44 -0
  675. tooluniverse/tools/get_pysam_info.py +46 -0
  676. tooluniverse/tools/get_pyscenic_info.py +46 -0
  677. tooluniverse/tools/get_pyscf_info.py +46 -0
  678. tooluniverse/tools/get_pyscreener_info.py +46 -0
  679. tooluniverse/tools/get_pytdc_info.py +46 -0
  680. tooluniverse/tools/get_python_libsbml_info.py +46 -0
  681. tooluniverse/tools/get_pytorch_info.py +49 -0
  682. tooluniverse/tools/get_pyvcf_info.py +44 -0
  683. tooluniverse/tools/get_pyvis_info.py +44 -0
  684. tooluniverse/tools/get_qutip_info.py +44 -0
  685. tooluniverse/tools/get_rasterio_info.py +44 -0
  686. tooluniverse/tools/get_rdkit_info.py +46 -0
  687. tooluniverse/tools/get_refinement_resolution_by_pdb_id.py +49 -0
  688. tooluniverse/tools/get_release_deposit_dates_by_pdb_id.py +49 -0
  689. tooluniverse/tools/get_reportlab_info.py +49 -0
  690. tooluniverse/tools/get_requests_info.py +49 -0
  691. tooluniverse/tools/get_ruptures_info.py +46 -0
  692. tooluniverse/tools/get_scanorama_info.py +44 -0
  693. tooluniverse/tools/get_scanpy_info.py +49 -0
  694. tooluniverse/tools/get_schnetpack_info.py +49 -0
  695. tooluniverse/tools/get_scholarly_info.py +46 -0
  696. tooluniverse/tools/get_scikit_bio_info.py +49 -0
  697. tooluniverse/tools/get_scikit_image_info.py +46 -0
  698. tooluniverse/tools/get_scikit_learn_info.py +49 -0
  699. tooluniverse/tools/get_scipy_info.py +46 -0
  700. tooluniverse/tools/get_scrublet_info.py +49 -0
  701. tooluniverse/tools/get_scvelo_info.py +49 -0
  702. tooluniverse/tools/get_scvi_tools_info.py +44 -0
  703. tooluniverse/tools/get_seaborn_info.py +49 -0
  704. tooluniverse/tools/get_sequence_by_pdb_id.py +46 -0
  705. tooluniverse/tools/get_sequence_lengths_by_pdb_id.py +46 -0
  706. tooluniverse/tools/get_sequence_positional_features_by_instance_id.py +49 -0
  707. tooluniverse/tools/get_skopt_info.py +44 -0
  708. tooluniverse/tools/get_souporcell_info.py +46 -0
  709. tooluniverse/tools/get_source_organism_by_pdb_id.py +46 -0
  710. tooluniverse/tools/get_space_group_by_pdb_id.py +46 -0
  711. tooluniverse/tools/get_statsmodels_info.py +49 -0
  712. tooluniverse/tools/get_structure_determination_software_by_pdb_id.py +49 -0
  713. tooluniverse/tools/get_structure_title_by_pdb_id.py +46 -0
  714. tooluniverse/tools/get_structure_validation_metrics_by_pdb_id.py +49 -0
  715. tooluniverse/tools/get_sunpy_info.py +44 -0
  716. tooluniverse/tools/get_sympy_info.py +46 -0
  717. tooluniverse/tools/get_target_cofactor_info.py +46 -0
  718. tooluniverse/tools/get_taxonomy_by_pdb_id.py +46 -0
  719. tooluniverse/tools/get_tiledb_info.py +46 -0
  720. tooluniverse/tools/get_tiledbsoma_info.py +46 -0
  721. tooluniverse/tools/get_torch_geometric_info.py +49 -0
  722. tooluniverse/tools/get_tqdm_info.py +46 -0
  723. tooluniverse/tools/get_trackpy_info.py +46 -0
  724. tooluniverse/tools/get_tskit_info.py +46 -0
  725. tooluniverse/tools/get_umap_learn_info.py +49 -0
  726. tooluniverse/tools/get_uniprot_accession_by_entity_id.py +49 -0
  727. tooluniverse/tools/get_velocyto_info.py +44 -0
  728. tooluniverse/tools/get_viennarna_info.py +49 -0
  729. tooluniverse/tools/get_webpage_text_from_url.py +52 -0
  730. tooluniverse/tools/get_webpage_title.py +49 -0
  731. tooluniverse/tools/get_xarray_info.py +44 -0
  732. tooluniverse/tools/get_xesmf_info.py +44 -0
  733. tooluniverse/tools/get_xgboost_info.py +44 -0
  734. tooluniverse/tools/get_zarr_info.py +44 -0
  735. tooluniverse/tools/gwas_get_association_by_id.py +49 -0
  736. tooluniverse/tools/gwas_get_associations_for_snp.py +67 -0
  737. tooluniverse/tools/gwas_get_associations_for_study.py +55 -0
  738. tooluniverse/tools/gwas_get_associations_for_trait.py +55 -0
  739. tooluniverse/tools/gwas_get_snp_by_id.py +46 -0
  740. tooluniverse/tools/gwas_get_snps_for_gene.py +55 -0
  741. tooluniverse/tools/gwas_get_studies_for_trait.py +75 -0
  742. tooluniverse/tools/gwas_get_study_by_id.py +46 -0
  743. tooluniverse/tools/gwas_get_variants_for_trait.py +55 -0
  744. tooluniverse/tools/gwas_search_associations.py +75 -0
  745. tooluniverse/tools/gwas_search_snps.py +63 -0
  746. tooluniverse/tools/gwas_search_studies.py +75 -0
  747. tooluniverse/tools/humanbase_ppi_analysis.py +67 -0
  748. tooluniverse/tools/mesh_get_subjects_by_pharmacological_action.py +63 -0
  749. tooluniverse/tools/mesh_get_subjects_by_subject_id.py +63 -0
  750. tooluniverse/tools/mesh_get_subjects_by_subject_name.py +63 -0
  751. tooluniverse/tools/mesh_get_subjects_by_subject_scope_or_definition.py +63 -0
  752. tooluniverse/tools/odphp_itemlist.py +49 -0
  753. tooluniverse/tools/odphp_myhealthfinder.py +67 -0
  754. tooluniverse/tools/odphp_outlink_fetch.py +59 -0
  755. tooluniverse/tools/odphp_topicsearch.py +67 -0
  756. tooluniverse/tools/openalex_literature_search.py +67 -0
  757. tooluniverse/tools/reactome_disease_target_score.py +52 -0
  758. tooluniverse/tools/search_clinical_trials.py +67 -0
  759. tooluniverse/tools/visualize_molecule_2d.py +83 -0
  760. tooluniverse/tools/visualize_molecule_3d.py +91 -0
  761. tooluniverse/tools/visualize_protein_structure_3d.py +79 -0
  762. tooluniverse/unified_guideline_tools.py +1210 -0
  763. tooluniverse/unpaywall_tool.py +0 -1
  764. tooluniverse/utils.py +71 -2
  765. tooluniverse/visualization_tool.py +897 -0
  766. tooluniverse/wikidata_sparql_tool.py +1 -2
  767. tooluniverse/zenodo_tool.py +1 -3
  768. {tooluniverse-1.0.6.dist-info → tooluniverse-1.0.7.dist-info}/METADATA +11 -2
  769. tooluniverse-1.0.7.dist-info/RECORD +855 -0
  770. {tooluniverse-1.0.6.dist-info → tooluniverse-1.0.7.dist-info}/entry_points.txt +3 -0
  771. tooluniverse/test/list_azure_openai_models.py +0 -210
  772. tooluniverse/test/mcp_server_test.py +0 -0
  773. tooluniverse/test/test_admetai_tool.py +0 -370
  774. tooluniverse/test/test_agentic_tool.py +0 -129
  775. tooluniverse/test/test_agentic_tool_azure_models.py +0 -91
  776. tooluniverse/test/test_alphafold_tool.py +0 -108
  777. tooluniverse/test/test_api_key_validation_min.py +0 -64
  778. tooluniverse/test/test_chem_tool.py +0 -37
  779. tooluniverse/test/test_claude_sdk.py +0 -93
  780. tooluniverse/test/test_compose_lieraturereview.py +0 -63
  781. tooluniverse/test/test_compose_tool.py +0 -448
  782. tooluniverse/test/test_dailymed.py +0 -69
  783. tooluniverse/test/test_dataset_tool.py +0 -200
  784. tooluniverse/test/test_disease_target_score.py +0 -56
  785. tooluniverse/test/test_drugbank_filter_examples.py +0 -179
  786. tooluniverse/test/test_efo.py +0 -31
  787. tooluniverse/test/test_enrichr_tool.py +0 -21
  788. tooluniverse/test/test_europe_pmc_tool.py +0 -20
  789. tooluniverse/test/test_fda_adv.py +0 -95
  790. tooluniverse/test/test_fda_drug_labeling.py +0 -91
  791. tooluniverse/test/test_gene_ontology_tools.py +0 -66
  792. tooluniverse/test/test_global_fallback.py +0 -288
  793. tooluniverse/test/test_gwas_tool.py +0 -139
  794. tooluniverse/test/test_hooks_direct.py +0 -219
  795. tooluniverse/test/test_hpa.py +0 -625
  796. tooluniverse/test/test_humanbase_tool.py +0 -20
  797. tooluniverse/test/test_idmap_tools.py +0 -61
  798. tooluniverse/test/test_list_built_in_tools.py +0 -33
  799. tooluniverse/test/test_mcp_server.py +0 -211
  800. tooluniverse/test/test_mcp_tool.py +0 -247
  801. tooluniverse/test/test_medlineplus.py +0 -220
  802. tooluniverse/test/test_odphp_tool.py +0 -166
  803. tooluniverse/test/test_openalex_tool.py +0 -32
  804. tooluniverse/test/test_openrouter_client.py +0 -288
  805. tooluniverse/test/test_opentargets.py +0 -28
  806. tooluniverse/test/test_pubchem_tool.py +0 -116
  807. tooluniverse/test/test_pubtator_tool.py +0 -37
  808. tooluniverse/test/test_rcsb_pdb_tool.py +0 -86
  809. tooluniverse/test/test_reactome.py +0 -54
  810. tooluniverse/test/test_semantic_scholar_tool.py +0 -24
  811. tooluniverse/test/test_software_tools.py +0 -147
  812. tooluniverse/test/test_stdio_hooks.py +0 -285
  813. tooluniverse/test/test_tool_description_optimizer.py +0 -49
  814. tooluniverse/test/test_tool_finder.py +0 -26
  815. tooluniverse/test/test_tool_finder_llm.py +0 -252
  816. tooluniverse/test/test_tools_find.py +0 -195
  817. tooluniverse/test/test_uniprot_tools.py +0 -74
  818. tooluniverse/test/test_uspto_tool.py +0 -72
  819. tooluniverse/test/test_xml_tool.py +0 -113
  820. tooluniverse-1.0.6.dist-info/RECORD +0 -230
  821. {tooluniverse-1.0.6.dist-info → tooluniverse-1.0.7.dist-info}/WHEEL +0 -0
  822. {tooluniverse-1.0.6.dist-info → tooluniverse-1.0.7.dist-info}/licenses/LICENSE +0 -0
  823. {tooluniverse-1.0.6.dist-info → tooluniverse-1.0.7.dist-info}/top_level.txt +0 -0
@@ -31,12 +31,24 @@ import random
31
31
  import string
32
32
  import os
33
33
  import time
34
+ import hashlib
35
+ import warnings
36
+ from typing import Any, Dict, List, Optional
34
37
  from .utils import read_json_list, evaluate_function_call, extract_function_call_json
38
+ from .exceptions import (
39
+ ToolError,
40
+ ToolUnavailableError,
41
+ ToolValidationError,
42
+ ToolConfigError,
43
+ ToolServerError,
44
+ )
35
45
  from .tool_registry import (
36
46
  auto_discover_tools,
37
47
  get_tool_registry,
38
48
  register_external_tool,
39
49
  get_tool_class_lazy,
50
+ get_tool_errors,
51
+ mark_tool_unavailable,
40
52
  )
41
53
  from .logging_config import (
42
54
  get_logger,
@@ -81,6 +93,82 @@ for _tool_name, _tool_class in sorted(tool_type_mappings.items()):
81
93
  debug(f" - {_tool_name}: {_tool_class.__name__}")
82
94
 
83
95
 
96
+ class ToolCallable:
97
+ """
98
+ A callable wrapper for a tool that validates kwargs and calls run_one_function.
99
+
100
+ This class provides the dynamic function interface for tools, allowing
101
+ them to be called like regular Python functions with keyword arguments.
102
+ """
103
+
104
+ def __init__(self, engine: "ToolUniverse", tool_name: str):
105
+ self.engine = engine
106
+ self.tool_name = tool_name
107
+ self.schema = engine.all_tool_dict[tool_name]["parameter"]
108
+ self.__doc__ = engine.all_tool_dict[tool_name].get("description", tool_name)
109
+
110
+ def __call__(
111
+ self, *, stream_callback=None, use_cache=False, validate=True, **kwargs
112
+ ):
113
+ """
114
+ Execute the tool with the provided keyword arguments.
115
+
116
+ Args:
117
+ stream_callback: Optional callback for streaming responses
118
+ use_cache: Whether to use result caching
119
+ validate: Whether to validate parameters against schema
120
+ **kwargs: Tool-specific arguments
121
+
122
+ Returns:
123
+ Tool execution result
124
+ """
125
+ function_call = {"name": self.tool_name, "arguments": kwargs}
126
+ return self.engine.run_one_function(
127
+ function_call,
128
+ stream_callback=stream_callback,
129
+ use_cache=use_cache,
130
+ validate=validate,
131
+ )
132
+
133
+
134
+ class ToolNamespace:
135
+ """
136
+ Dynamic namespace for accessing tools as callable functions.
137
+
138
+ This class provides the `tu.tools.tool_name(**kwargs)` interface,
139
+ dynamically creating ToolCallable instances for each available tool.
140
+ """
141
+
142
+ def __init__(self, engine: "ToolUniverse"):
143
+ self.engine = engine
144
+
145
+ def __getattr__(self, name: str) -> ToolCallable:
146
+ """Return a ToolCallable for the requested tool name."""
147
+ if name in self.engine.all_tool_dict:
148
+ return ToolCallable(self.engine, name)
149
+ raise AttributeError(f"Tool '{name}' not found")
150
+
151
+ def __len__(self) -> int:
152
+ """Return the number of available tools."""
153
+ return len(self.engine.all_tool_dict)
154
+
155
+ def __iter__(self):
156
+ """Iterate over tool names."""
157
+ return iter(self.engine.all_tool_dict.keys())
158
+
159
+ def __contains__(self, name: str) -> bool:
160
+ """Check if a tool exists."""
161
+ return name in self.engine.all_tool_dict
162
+
163
+ def refresh(self):
164
+ """Refresh tool discovery (re-discover MCP/remote tools)."""
165
+ self.engine.refresh_tools()
166
+
167
+ def eager_load(self, names: Optional[List[str]] = None):
168
+ """Pre-instantiate tools to reduce first-call latency."""
169
+ self.engine.eager_load_tools(names)
170
+
171
+
84
172
  class ToolUniverse:
85
173
  """
86
174
  A comprehensive tool management system for loading, organizing, and executing various scientific and data tools.
@@ -130,9 +218,9 @@ class ToolUniverse:
130
218
  self.logger = get_logger("ToolUniverse")
131
219
 
132
220
  # Initialize any necessary attributes here FIRST
133
- self.all_tools = []
134
- self.all_tool_dict = {}
135
- self.tool_category_dicts = {}
221
+ self.all_tools: List[Dict[str, Any]] = []
222
+ self.all_tool_dict: Dict[str, Dict[str, Any]] = {}
223
+ self.tool_category_dicts: Dict[str, List[Dict[str, Any]]] = {}
136
224
  self.tool_finder = None
137
225
  if tool_files is None:
138
226
  tool_files = default_tool_files
@@ -172,6 +260,16 @@ class ToolUniverse:
172
260
  self.hook_manager = None
173
261
  self.logger.debug("Output hooks disabled")
174
262
 
263
+ # Initialize new attributes for enhanced functionality
264
+ self._cache = {} # Simple cache for tool results
265
+ self._cache_size = int(os.getenv("TOOLUNIVERSE_CACHE_SIZE", "100"))
266
+ self._strict_validation = os.getenv(
267
+ "TOOLUNIVERSE_STRICT_VALIDATION", "false"
268
+ ).lower() in ("true", "1", "yes")
269
+
270
+ # Initialize dynamic tools namespace
271
+ self.tools = ToolNamespace(self)
272
+
175
273
  def register_custom_tool(self, tool_class, tool_name=None, tool_config=None):
176
274
  """
177
275
  Register a custom tool class at runtime.
@@ -903,104 +1001,6 @@ class ToolUniverse:
903
1001
  )
904
1002
  self.logger.debug("_process_mcp_auto_loaders completed")
905
1003
 
906
- def select_tools(
907
- self,
908
- include_names=None,
909
- exclude_names=None,
910
- include_categories=None,
911
- exclude_categories=None,
912
- ):
913
- """
914
- Select tools based on tool names and/or categories (tool_files keys).
915
-
916
- Args:
917
- include_names (list, optional): List of tool names to include. If None, include all.
918
- exclude_names (list, optional): List of tool names to exclude.
919
- include_categories (list, optional): List of categories (tool_files keys) to include.
920
- If None, include all.
921
- exclude_categories (list, optional): List of categories (tool_files keys) to exclude.
922
-
923
- Returns:
924
- list: List of selected tool configurations.
925
- """
926
- selected_tools = []
927
- # If categories are specified, use self.tool_category_dicts to filter
928
- categories = set(self.tool_category_dicts.keys())
929
- if include_categories is not None:
930
- categories &= set(include_categories)
931
- if exclude_categories is not None:
932
- categories -= set(exclude_categories)
933
- # Gather tools from selected categories
934
- for cat in categories:
935
- selected_tools.extend(self.tool_category_dicts[cat])
936
- # Further filter by names if needed
937
- if include_names is not None:
938
- selected_tools = [
939
- tool for tool in selected_tools if tool["name"] in include_names
940
- ]
941
- if exclude_names is not None:
942
- selected_tools = [
943
- tool for tool in selected_tools if tool["name"] not in exclude_names
944
- ]
945
- return selected_tools
946
-
947
- def filter_tool_lists(
948
- self,
949
- tool_name_list,
950
- tool_desc_list,
951
- include_names=None,
952
- exclude_names=None,
953
- include_categories=None,
954
- exclude_categories=None,
955
- ):
956
- """
957
- Directly filter tool name and description lists based on names and/or categories.
958
-
959
- This method takes existing tool name and description lists and filters them according
960
- to the specified criteria using the select_tools method for category-based filtering.
961
-
962
- Args:
963
- tool_name_list (list): List of tool names to filter.
964
- tool_desc_list (list): List of tool descriptions to filter (must correspond to tool_name_list).
965
- include_names (list, optional): List of tool names to include.
966
- exclude_names (list, optional): List of tool names to exclude.
967
- include_categories (list, optional): List of categories to include.
968
- exclude_categories (list, optional): List of categories to exclude.
969
-
970
- Returns:
971
- tuple: A tuple containing (filtered_tool_name_list, filtered_tool_desc_list).
972
- """
973
- # Build a set of allowed tool names using select_tools for category filtering
974
- allowed_names = set()
975
- if any([include_names, exclude_names, include_categories, exclude_categories]):
976
- filtered_tools = self.select_tools(
977
- include_names=include_names,
978
- exclude_names=exclude_names,
979
- include_categories=include_categories,
980
- exclude_categories=exclude_categories,
981
- )
982
- allowed_names = set(tool["name"] for tool in filtered_tools)
983
- else:
984
- allowed_names = set(tool_name_list)
985
-
986
- # Filter lists by allowed_names
987
- filtered_tool_name_list = []
988
- filtered_tool_desc_list = []
989
- for name, desc in zip(tool_name_list, tool_desc_list):
990
- if name in allowed_names:
991
- filtered_tool_name_list.append(name)
992
- filtered_tool_desc_list.append(desc)
993
- return filtered_tool_name_list, filtered_tool_desc_list
994
-
995
- def return_all_loaded_tools(self):
996
- """
997
- Return a deep copy of all loaded tools.
998
-
999
- Returns:
1000
- list: A deep copy of the all_tools list to prevent external modification.
1001
- """
1002
- return copy.deepcopy(self.all_tools)
1003
-
1004
1004
  def list_built_in_tools(self, mode="config", scan_all=False):
1005
1005
  """
1006
1006
  List all built-in tool categories and their statistics with different modes.
@@ -1211,6 +1211,39 @@ class ToolUniverse:
1211
1211
 
1212
1212
  return result
1213
1213
 
1214
+ def _read_tools_from_file(self, file_path):
1215
+ """
1216
+ Read tools from a single JSON file with error handling.
1217
+
1218
+ Args:
1219
+ file_path (str): Path to the JSON file
1220
+
1221
+ Returns:
1222
+ list: List of tool configurations from the file
1223
+ """
1224
+ try:
1225
+ tools_in_file = read_json_list(file_path)
1226
+
1227
+ # Handle different data formats
1228
+ if isinstance(tools_in_file, dict):
1229
+ # Convert dict of tools to list of tools
1230
+ tools_in_file = list(tools_in_file.values())
1231
+ elif not isinstance(tools_in_file, list):
1232
+ # Skip files that don't contain tool configurations
1233
+ return []
1234
+
1235
+ # Validate tools have required fields
1236
+ valid_tools = []
1237
+ for tool in tools_in_file:
1238
+ if isinstance(tool, dict) and "name" in tool:
1239
+ valid_tools.append(tool)
1240
+
1241
+ return valid_tools
1242
+
1243
+ except Exception as e:
1244
+ warning(f"Warning: Could not read tools from {file_path}: {e}")
1245
+ return []
1246
+
1214
1247
  def _scan_predefined_files(self):
1215
1248
  """
1216
1249
  Scan predefined tool files (original behavior).
@@ -1223,39 +1256,23 @@ class ToolUniverse:
1223
1256
  all_tool_names = set()
1224
1257
 
1225
1258
  # Read tools from each category file
1226
- for category, file_path in self.tool_files.items():
1227
- try:
1228
- # Read the JSON file for this category
1229
- tools_in_category = read_json_list(file_path)
1230
- all_tools.extend(tools_in_category)
1231
- all_tool_names.update([tool["name"] for tool in tools_in_category])
1232
- except Exception as e:
1233
- warning(
1234
- f"Warning: Could not read tools from {category} ({file_path}): {e}"
1235
- )
1259
+ for _category, file_path in self.tool_files.items():
1260
+ tools_in_category = self._read_tools_from_file(file_path)
1261
+ all_tools.extend(tools_in_category)
1262
+ all_tool_names.update([tool["name"] for tool in tools_in_category])
1236
1263
 
1237
1264
  # Also include remote tools
1238
1265
  try:
1239
1266
  remote_dir = os.path.join(current_dir, "data", "remote_tools")
1240
1267
  if os.path.isdir(remote_dir):
1241
- remote_tools = []
1242
1268
  for fname in os.listdir(remote_dir):
1243
1269
  if not fname.lower().endswith(".json"):
1244
1270
  continue
1245
1271
  fpath = os.path.join(remote_dir, fname)
1246
- try:
1247
- tools_in_file = read_json_list(fpath)
1248
- if isinstance(tools_in_file, dict):
1249
- tools_in_file = list(tools_in_file.values())
1250
- if isinstance(tools_in_file, list):
1251
- remote_tools.extend(tools_in_file)
1252
- except Exception as e:
1253
- warning(
1254
- f"Warning: Could not read remote tools from {fpath}: {e}"
1255
- )
1256
- if remote_tools:
1257
- all_tools.extend(remote_tools)
1258
- all_tool_names.update([tool["name"] for tool in remote_tools])
1272
+ remote_tools = self._read_tools_from_file(fpath)
1273
+ if remote_tools:
1274
+ all_tools.extend(remote_tools)
1275
+ all_tool_names.update([tool["name"] for tool in remote_tools])
1259
1276
  except Exception as e:
1260
1277
  warning(f"Warning: Failed to scan remote tools directory: {e}")
1261
1278
 
@@ -1288,31 +1305,14 @@ class ToolUniverse:
1288
1305
 
1289
1306
  self.logger.debug(f"Found {len(json_files)} JSON files to scan")
1290
1307
 
1291
- # Read tools from each JSON file
1308
+ # Read tools from each JSON file using the common method
1292
1309
  for json_file in json_files:
1293
- try:
1294
- tools_in_file = read_json_list(json_file)
1295
-
1296
- # Handle different data formats
1297
- if isinstance(tools_in_file, dict):
1298
- # Convert dict of tools to list of tools
1299
- tools_in_file = list(tools_in_file.values())
1300
- elif not isinstance(tools_in_file, list):
1301
- # Skip files that don't contain tool configurations
1302
- continue
1303
-
1304
- # Add tools to our collection
1305
- for tool in tools_in_file:
1306
- if isinstance(tool, dict) and "name" in tool:
1307
- all_tools.append(tool)
1308
- all_tool_names.add(tool["name"])
1309
-
1310
+ tools_in_file = self._read_tools_from_file(json_file)
1311
+ if tools_in_file:
1312
+ all_tools.extend(tools_in_file)
1313
+ all_tool_names.update([tool["name"] for tool in tools_in_file])
1310
1314
  self.logger.debug(f"Loaded {len(tools_in_file)} tools from {json_file}")
1311
1315
 
1312
- except Exception as e:
1313
- warning(f"Warning: Could not read tools from {json_file}: {e}")
1314
- continue
1315
-
1316
1316
  self.logger.info(
1317
1317
  f"Scanned {len(json_files)} JSON files, found {len(all_tools)} tools"
1318
1318
  )
@@ -1387,63 +1387,42 @@ class ToolUniverse:
1387
1387
  del tool[key]
1388
1388
  return tool
1389
1389
 
1390
- def prepare_tool_prompts(self, tool_list):
1391
- """
1392
- Prepare a list of tool configurations for prompt usage.
1393
-
1394
- Args:
1395
- tool_list (list): List of tool configuration dictionaries.
1396
-
1397
- Returns:
1398
- list: List of tool configurations with only essential keys for prompting.
1399
- """
1400
- copied_list = []
1401
- for tool in tool_list:
1402
- copied_list.append(self.prepare_one_tool_prompt(tool))
1403
- return copied_list
1404
-
1405
- def remove_keys(self, tool_list, invalid_keys):
1390
+ def prepare_tool_prompts(self, tool_list, mode="prompt", valid_keys=None):
1406
1391
  """
1407
- Remove specified keys from a list of tool configurations.
1392
+ Prepare a list of tool configurations for different usage modes.
1408
1393
 
1409
1394
  Args:
1410
1395
  tool_list (list): List of tool configuration dictionaries.
1411
- invalid_keys (list): List of keys to remove from each tool configuration.
1396
+ mode (str): Preparation mode. Options:
1397
+ - 'prompt': Keep essential keys for prompting (name, description, parameter, required)
1398
+ - 'example': Keep extended keys for examples (name, description, parameter, required, query_schema, fields, label, type)
1399
+ - 'custom': Use custom valid_keys parameter
1400
+ valid_keys (list, optional): Custom list of keys to keep when mode='custom'.
1412
1401
 
1413
1402
  Returns:
1414
- list: Deep copy of tool list with specified keys removed.
1415
- """
1416
- copied_list = copy.deepcopy(tool_list)
1417
- for tool in copied_list:
1418
- # Create a list of keys to avoid modifying the dictionary during iteration
1419
- for key in list(tool.keys()):
1420
- if key in invalid_keys:
1421
- del tool[key]
1422
- return copied_list
1423
-
1424
- def prepare_tool_examples(self, tool_list):
1425
- """
1426
- Prepare tool configurations for example usage by keeping extended set of keys.
1427
-
1428
- This method is similar to prepare_tool_prompts but includes additional keys
1429
- useful for examples and documentation.
1430
-
1431
- Args:
1432
- tool_list (list): List of tool configuration dictionaries.
1403
+ list: List of tool configurations with only specified keys.
1404
+ """
1405
+ if mode == "prompt":
1406
+ valid_keys = ["name", "description", "parameter", "required"]
1407
+ elif mode == "example":
1408
+ valid_keys = [
1409
+ "name",
1410
+ "description",
1411
+ "parameter",
1412
+ "required",
1413
+ "query_schema",
1414
+ "fields",
1415
+ "label",
1416
+ "type",
1417
+ ]
1418
+ elif mode == "custom":
1419
+ if valid_keys is None:
1420
+ raise ValueError("valid_keys must be provided when mode='custom'")
1421
+ else:
1422
+ raise ValueError(
1423
+ f"Invalid mode: {mode}. Must be 'prompt', 'example', or 'custom'"
1424
+ )
1433
1425
 
1434
- Returns:
1435
- list: Deep copy of tool list with only example-relevant keys.
1436
- """
1437
- valid_keys = [
1438
- "name",
1439
- "description",
1440
- "parameter",
1441
- "required",
1442
- "query_schema",
1443
- "fields",
1444
- "label",
1445
- "type",
1446
- ]
1447
1426
  copied_list = copy.deepcopy(tool_list)
1448
1427
  for tool in copied_list:
1449
1428
  # Create a list of keys to avoid modifying the dictionary during iteration
@@ -1472,21 +1451,6 @@ class ToolUniverse:
1472
1451
  picked_tool_list.append(tool_spec)
1473
1452
  return picked_tool_list
1474
1453
 
1475
- def get_tool_by_name(self, tool_names, format="default"):
1476
- """
1477
- Retrieve tool configurations by their names.
1478
-
1479
- Args:
1480
- tool_names (list): List of tool names to retrieve.
1481
- format (str, optional): Output format. Options: 'default', 'openai'.
1482
- If 'openai', returns OpenAI function calling format. Defaults to 'default'.
1483
-
1484
- Returns:
1485
- list: List of tool configurations for the specified names.
1486
- Tools not found will be reported but not included in the result.
1487
- """
1488
- return self.get_tool_specification_by_names(tool_names, format=format)
1489
-
1490
1454
  def get_one_tool_by_one_name(self, tool_name, return_prompt=True):
1491
1455
  """
1492
1456
  Retrieve a single tool specification by name, optionally prepared for prompting.
@@ -1521,65 +1485,58 @@ class ToolUniverse:
1521
1485
  Returns:
1522
1486
  dict or None: Tool configuration if found, None otherwise.
1523
1487
  """
1524
- if tool_name in self.all_tool_dict:
1525
- tool_config = self.all_tool_dict[tool_name]
1526
-
1527
- if format == "openai":
1528
- parameters = tool_config.get("parameter", {})
1529
- if isinstance(parameters, dict):
1530
- # 修复 required 字段格式
1531
- if "properties" in parameters:
1532
- for _prop_name, prop_config in parameters["properties"].items():
1533
- if (
1534
- isinstance(prop_config, dict)
1535
- and "required" in prop_config
1536
- ):
1537
- del prop_config["required"]
1538
-
1539
- if "required" in parameters and not isinstance(
1540
- parameters["required"], list
1541
- ):
1542
- if parameters["required"] is True:
1543
- required_list = []
1544
- if "properties" in parameters:
1545
- for prop_name, prop_config in parameters[
1546
- "properties"
1547
- ].items():
1548
- if (
1549
- isinstance(prop_config, dict)
1550
- and prop_config.get("required") is True
1551
- ):
1552
- required_list.append(prop_name)
1553
- parameters["required"] = required_list
1554
- else:
1555
- parameters["required"] = []
1556
-
1557
- return {
1558
- "name": tool_config["name"],
1559
- "description": tool_config["description"],
1560
- "parameters": parameters,
1561
- }
1562
- elif return_prompt:
1563
- return self.prepare_one_tool_prompt(tool_config)
1564
- else:
1565
- return tool_config
1566
- else:
1488
+ if tool_name not in self.all_tool_dict:
1567
1489
  warning(f"Tool name {tool_name} not found in the loaded tools.")
1568
1490
  return None
1569
1491
 
1570
- def get_tool_description(self, tool_name):
1571
- """
1572
- Get the description of a tool by its name.
1492
+ tool_config = self.all_tool_dict[tool_name]
1573
1493
 
1574
- This is a convenience method that calls get_one_tool_by_one_name.
1494
+ if return_prompt:
1495
+ return self.prepare_one_tool_prompt(tool_config)
1575
1496
 
1576
- Args:
1577
- tool_name (str): Name of the tool.
1497
+ # Process parameter schema based on format
1498
+ if "parameter" in tool_config and isinstance(tool_config["parameter"], dict):
1499
+ import copy
1578
1500
 
1579
- Returns:
1580
- dict or None: Tool configuration if found, None otherwise.
1581
- """
1582
- return self.get_one_tool_by_one_name(tool_name)
1501
+ processed_config = copy.deepcopy(tool_config)
1502
+ parameter_schema = processed_config["parameter"]
1503
+
1504
+ if (
1505
+ "properties" in parameter_schema
1506
+ and parameter_schema["properties"] is not None
1507
+ ):
1508
+ required_properties = parameter_schema.get("required", [])
1509
+
1510
+ if format == "openai":
1511
+ # For OpenAI format: remove property-level required fields
1512
+ for _prop_name, prop_config in parameter_schema[
1513
+ "properties"
1514
+ ].items():
1515
+ if isinstance(prop_config, dict) and "required" in prop_config:
1516
+ del prop_config["required"]
1517
+
1518
+ # Ensure required is a list
1519
+ if not isinstance(parameter_schema.get("required"), list):
1520
+ parameter_schema["required"] = (
1521
+ required_properties if required_properties else []
1522
+ )
1523
+
1524
+ return {
1525
+ "name": processed_config["name"],
1526
+ "description": processed_config["description"],
1527
+ "parameters": parameter_schema,
1528
+ }
1529
+ else:
1530
+ # For default format: add required fields to properties
1531
+ for prop_name, prop_config in parameter_schema[
1532
+ "properties"
1533
+ ].items():
1534
+ if isinstance(prop_config, dict):
1535
+ prop_config["required"] = prop_name in required_properties
1536
+
1537
+ return processed_config
1538
+
1539
+ return tool_config
1583
1540
 
1584
1541
  def get_tool_type_by_name(self, tool_name):
1585
1542
  """
@@ -1596,6 +1553,15 @@ class ToolUniverse:
1596
1553
  """
1597
1554
  return self.all_tool_dict[tool_name]["type"]
1598
1555
 
1556
+ def call_id_gen(self):
1557
+ """
1558
+ Generate a random call ID for function calls.
1559
+
1560
+ Returns:
1561
+ str: A random 9-character string composed of letters and digits.
1562
+ """
1563
+ return "".join(random.choices(string.ascii_letters + string.digits, k=9))
1564
+
1599
1565
  def tool_to_str(self, tool_list):
1600
1566
  """
1601
1567
  Convert a list of tool configurations to a formatted string.
@@ -1630,14 +1596,14 @@ class ToolUniverse:
1630
1596
  lst, return_message=return_message, verbose=verbose, format=format
1631
1597
  )
1632
1598
 
1633
- def call_id_gen(self):
1599
+ def return_all_loaded_tools(self):
1634
1600
  """
1635
- Generate a random call ID for function calls.
1601
+ Return a deep copy of all loaded tools.
1636
1602
 
1637
1603
  Returns:
1638
- str: A random 9-character string composed of letters and digits.
1604
+ list: A deep copy of the all_tools list to prevent external modification.
1639
1605
  """
1640
- return "".join(random.choices(string.ascii_letters + string.digits, k=9))
1606
+ return copy.deepcopy(self.all_tools)
1641
1607
 
1642
1608
  def run(
1643
1609
  self,
@@ -1708,7 +1674,9 @@ class ToolUniverse:
1708
1674
  error("Not a function call")
1709
1675
  return None
1710
1676
 
1711
- def run_one_function(self, function_call_json, stream_callback=None):
1677
+ def run_one_function(
1678
+ self, function_call_json, stream_callback=None, use_cache=False, validate=True
1679
+ ):
1712
1680
  """
1713
1681
  Execute a single function call.
1714
1682
 
@@ -1718,40 +1686,63 @@ class ToolUniverse:
1718
1686
 
1719
1687
  Args:
1720
1688
  function_call_json (dict): Dictionary containing function name and arguments.
1689
+ stream_callback (callable, optional): Callback for streaming responses.
1690
+ use_cache (bool, optional): Whether to use result caching. Defaults to False.
1691
+ validate (bool, optional): Whether to validate parameters against schema. Defaults to True.
1721
1692
 
1722
1693
  Returns:
1723
1694
  str or dict: Result from the tool execution, or error message if validation fails.
1724
1695
  """
1725
- check_status, check_message = self.check_function_call(function_call_json)
1726
- if check_status is False:
1727
- return (
1728
- "Invalid function call: " + check_message
1729
- ) # + " You must correct your invalid function call!"
1730
1696
  function_name = function_call_json["name"]
1731
1697
  arguments = function_call_json["arguments"]
1732
1698
 
1699
+ # Check cache first if enabled
1700
+ if use_cache:
1701
+ cache_key = self._make_cache_key(function_name, arguments)
1702
+ if cache_key in self._cache:
1703
+ self.logger.debug(f"Cache hit for {function_name}")
1704
+ return self._cache[cache_key]
1705
+
1706
+ # Validate parameters if requested
1707
+ if validate:
1708
+ validation_error = self._validate_parameters(function_name, arguments)
1709
+ if validation_error:
1710
+ return self._create_dual_format_error(validation_error)
1711
+
1712
+ # Check function call format (existing validation)
1713
+ check_status, check_message = self.check_function_call(function_call_json)
1714
+ if check_status is False:
1715
+ error_msg = "Invalid function call: " + check_message
1716
+ return self._create_dual_format_error(
1717
+ ToolValidationError(error_msg, details={"check_message": check_message})
1718
+ )
1719
+
1733
1720
  # Execute the tool
1734
1721
  tool_instance = None
1735
1722
  tool_arguments = arguments
1736
- if function_name in self.callable_functions:
1737
- tool_instance = self.callable_functions[function_name]
1738
- result, tool_arguments = self._execute_tool_with_stream(
1739
- tool_instance, arguments, stream_callback
1740
- )
1741
- else:
1742
- if function_name in self.all_tool_dict:
1743
- self.logger.debug(
1744
- "Initiating callable_function from loaded tool dicts."
1745
- )
1746
- tool = self.init_tool(
1747
- self.all_tool_dict[function_name], add_to_cache=True
1748
- )
1749
- tool_instance = tool
1723
+ try:
1724
+ # Get or create tool instance (optimized to avoid duplication)
1725
+ tool_instance = self._get_tool_instance(function_name, cache=True)
1726
+
1727
+ if tool_instance:
1750
1728
  result, tool_arguments = self._execute_tool_with_stream(
1751
- tool_instance, arguments, stream_callback
1729
+ tool_instance, arguments, stream_callback, use_cache, validate
1752
1730
  )
1753
1731
  else:
1754
- return f"Tool '{function_name}' not found"
1732
+ error_msg = f"Tool '{function_name}' not found"
1733
+ return self._create_dual_format_error(
1734
+ ToolUnavailableError(
1735
+ error_msg,
1736
+ next_steps=[
1737
+ "Check tool name spelling",
1738
+ "Run tu.tools.refresh()",
1739
+ ],
1740
+ )
1741
+ )
1742
+ except Exception as e:
1743
+ # Classify and return structured error
1744
+ classified_error = self._classify_exception(e, function_name, arguments)
1745
+ return self._create_dual_format_error(classified_error)
1755
1746
 
1756
1747
  # Apply output hooks if enabled
1757
1748
  if self.hook_manager:
@@ -1769,16 +1760,26 @@ class ToolUniverse:
1769
1760
  result, function_name, tool_arguments, context
1770
1761
  )
1771
1762
 
1763
+ # Cache result if enabled
1764
+ if use_cache:
1765
+ cache_key = self._make_cache_key(function_name, arguments)
1766
+ self._cache[cache_key] = result
1767
+ # Simple cache size management
1768
+ if len(self._cache) > self._cache_size:
1769
+ # Remove oldest entries (simple FIFO)
1770
+ oldest_key = next(iter(self._cache))
1771
+ del self._cache[oldest_key]
1772
+
1772
1773
  return result
1773
1774
 
1774
- def _execute_tool_with_stream(self, tool_instance, arguments, stream_callback):
1775
- """Invoke a tool, forwarding stream callbacks when supported."""
1775
+ def _execute_tool_with_stream(
1776
+ self, tool_instance, arguments, stream_callback, use_cache=False, validate=True
1777
+ ):
1778
+ """Invoke a tool, forwarding stream callbacks and other parameters when supported."""
1776
1779
 
1777
1780
  tool_arguments = arguments
1778
1781
  stream_flag_key = (
1779
- getattr(tool_instance, "STREAM_FLAG_KEY", None)
1780
- if stream_callback
1781
- else None
1782
+ getattr(tool_instance, "STREAM_FLAG_KEY", None) if stream_callback else None
1782
1783
  )
1783
1784
 
1784
1785
  if isinstance(arguments, dict):
@@ -1791,24 +1792,30 @@ class ToolUniverse:
1791
1792
  ):
1792
1793
  tool_arguments[stream_flag_key] = True
1793
1794
 
1794
- if stream_callback is None:
1795
- return tool_instance.run(tool_arguments), tool_arguments
1796
-
1795
+ # Try to pass all available parameters to the tool
1797
1796
  try:
1798
1797
  signature = inspect.signature(tool_instance.run)
1799
- if "stream_callback" in signature.parameters:
1800
- return (
1801
- tool_instance.run(
1802
- tool_arguments, stream_callback=stream_callback
1803
- ),
1804
- tool_arguments,
1805
- )
1806
- except (ValueError, TypeError):
1807
- # If inspection fails, fall back to best-effort execution
1808
- pass
1809
-
1810
- # Tool doesn't support streaming yet; execute normally
1811
- return tool_instance.run(tool_arguments), tool_arguments
1798
+ params = signature.parameters
1799
+
1800
+ # Build kwargs based on what the tool accepts
1801
+ kwargs = {}
1802
+
1803
+ # Always include arguments as first positional argument
1804
+ if stream_callback is not None and "stream_callback" in params:
1805
+ kwargs["stream_callback"] = stream_callback
1806
+ if "use_cache" in params:
1807
+ kwargs["use_cache"] = use_cache
1808
+ if "validate" in params:
1809
+ kwargs["validate"] = validate
1810
+
1811
+ # Call with all supported parameters
1812
+ return tool_instance.run(tool_arguments, **kwargs), tool_arguments
1813
+
1814
+ except (ValueError, TypeError) as e:
1815
+ # If inspection fails or tool doesn't accept extra params,
1816
+ # fall back to simple execution with just arguments
1817
+ self.logger.debug(f"Falling back to simple run() call: {e}")
1818
+ return tool_instance.run(tool_arguments), tool_arguments
1812
1819
 
1813
1820
  def toggle_hooks(self, enabled: bool):
1814
1821
  """
@@ -1845,65 +1852,215 @@ class ToolUniverse:
1845
1852
  add_to_cache (bool, optional): Whether to cache the initialized tool. Defaults to True.
1846
1853
 
1847
1854
  Returns:
1848
- object: Initialized tool instance.
1855
+ object: Initialized tool instance or None if initialization fails.
1849
1856
 
1850
1857
  Raises:
1851
1858
  KeyError: If the tool type is not found in tool_type_mappings.
1852
1859
  """
1853
1860
  global tool_type_mappings
1854
1861
 
1855
- if tool_name is not None:
1856
- # Use lazy loading to get the tool class
1857
- tool_class = get_tool_class_lazy(tool_name)
1858
- if tool_class is None:
1859
- raise KeyError(f"Tool type '{tool_name}' not found in registry")
1860
- new_tool = tool_class()
1861
- else:
1862
- tool_type = tool["type"]
1863
- tool_name = tool["name"]
1864
-
1865
- # Use lazy loading to get the tool class
1866
- tool_class = get_tool_class_lazy(tool_type)
1867
- if tool_class is None:
1868
- # Fallback to old method if lazy loading fails
1869
- if tool_type not in tool_type_mappings:
1870
- # Refresh registry and try again
1871
- tool_type_mappings = get_tool_registry()
1872
- if tool_type not in tool_type_mappings:
1873
- raise KeyError(f"Tool type '{tool_type}' not found in registry")
1874
- tool_class = tool_type_mappings[tool_type]
1875
-
1876
- if "OpentargetToolDrugNameMatch" == tool_type:
1877
- if "FDADrugLabelGetDrugGenericNameTool" not in self.callable_functions:
1878
- drug_tool_class = get_tool_class_lazy(
1862
+ try:
1863
+ if tool_name is not None:
1864
+ # Use lazy loading to get the tool class
1865
+ tool_class = get_tool_class_lazy(tool_name)
1866
+ if tool_class is None:
1867
+ raise KeyError(f"Tool type '{tool_name}' not found in registry")
1868
+ new_tool = tool_class()
1869
+ else:
1870
+ tool_type = tool["type"]
1871
+ tool_name = tool["name"]
1872
+
1873
+ # Use lazy loading to get the tool class
1874
+ tool_class = get_tool_class_lazy(tool_type)
1875
+ if tool_class is None:
1876
+ # Fallback to old method if lazy loading fails
1877
+ if tool_type not in tool_type_mappings:
1878
+ # Refresh registry and try again
1879
+ tool_type_mappings = get_tool_registry()
1880
+ if tool_type not in tool_type_mappings:
1881
+ raise KeyError(f"Tool type '{tool_type}' not found in registry")
1882
+ tool_class = tool_type_mappings[tool_type]
1883
+
1884
+ if "OpentargetToolDrugNameMatch" == tool_type:
1885
+ if (
1879
1886
  "FDADrugLabelGetDrugGenericNameTool"
1880
- )
1881
- if drug_tool_class is None:
1882
- drug_tool_class = tool_type_mappings[
1887
+ not in self.callable_functions
1888
+ ):
1889
+ drug_tool_class = get_tool_class_lazy(
1890
+ "FDADrugLabelGetDrugGenericNameTool"
1891
+ )
1892
+ if drug_tool_class is None:
1893
+ drug_tool_class = tool_type_mappings[
1894
+ "FDADrugLabelGetDrugGenericNameTool"
1895
+ ]
1896
+ self.callable_functions[
1883
1897
  "FDADrugLabelGetDrugGenericNameTool"
1884
- ]
1885
- self.callable_functions["FDADrugLabelGetDrugGenericNameTool"] = (
1886
- drug_tool_class()
1898
+ ] = drug_tool_class()
1899
+ new_tool = tool_class(
1900
+ tool_config=tool,
1901
+ drug_generic_tool=self.callable_functions[
1902
+ "FDADrugLabelGetDrugGenericNameTool"
1903
+ ],
1887
1904
  )
1888
- new_tool = tool_class(
1889
- tool_config=tool,
1890
- drug_generic_tool=self.callable_functions[
1891
- "FDADrugLabelGetDrugGenericNameTool"
1892
- ],
1893
- )
1894
- elif "ToolFinderEmbedding" == tool_type:
1895
- new_tool = tool_class(tool_config=tool, tooluniverse=self)
1896
- elif "ComposeTool" == tool_type:
1897
- new_tool = tool_class(tool_config=tool, tooluniverse=self)
1898
- elif "ToolFinderLLM" == tool_type:
1899
- new_tool = tool_class(tool_config=tool, tooluniverse=self)
1900
- elif "ToolFinderKeyword" == tool_type:
1901
- new_tool = tool_class(tool_config=tool, tooluniverse=self)
1902
- else:
1903
- new_tool = tool_class(tool_config=tool)
1904
- if add_to_cache:
1905
- self.callable_functions[tool_name] = new_tool
1906
- return new_tool
1905
+ elif "ToolFinderEmbedding" == tool_type:
1906
+ new_tool = tool_class(tool_config=tool, tooluniverse=self)
1907
+ elif "ComposeTool" == tool_type:
1908
+ new_tool = tool_class(tool_config=tool, tooluniverse=self)
1909
+ elif "ToolFinderLLM" == tool_type:
1910
+ new_tool = tool_class(tool_config=tool, tooluniverse=self)
1911
+ elif "ToolFinderKeyword" == tool_type:
1912
+ new_tool = tool_class(tool_config=tool, tooluniverse=self)
1913
+ else:
1914
+ new_tool = tool_class(tool_config=tool)
1915
+
1916
+ if add_to_cache:
1917
+ self.callable_functions[tool_name] = new_tool
1918
+ return new_tool
1919
+
1920
+ except Exception as e:
1921
+ tool_type = tool_name if tool_name else tool.get("type")
1922
+ mark_tool_unavailable(tool_type, e)
1923
+ self.logger.warning(f"Failed to initialize '{tool_type}': {e}")
1924
+ return None # Return None instead of raising
1925
+
1926
+ def _get_tool_instance(self, function_name: str, cache: bool = True):
1927
+ """Get or create tool instance with optional caching."""
1928
+ # Check cache first
1929
+ if function_name in self.callable_functions:
1930
+ return self.callable_functions[function_name]
1931
+
1932
+ # Check if known unavailable
1933
+ tool_errors = get_tool_errors()
1934
+ if function_name in tool_errors:
1935
+ self.logger.debug(f"Tool {function_name} is unavailable")
1936
+ return None
1937
+
1938
+ # Try to initialize
1939
+ if function_name in self.all_tool_dict:
1940
+ return self.init_tool(self.all_tool_dict[function_name], add_to_cache=cache)
1941
+
1942
+ return None
1943
+
1944
+ def _make_cache_key(self, function_name: str, arguments: dict) -> str:
1945
+ """Generate cache key by delegating to BaseTool."""
1946
+ tool_instance = self._get_tool_instance(function_name, cache=False)
1947
+
1948
+ if tool_instance:
1949
+ return tool_instance.get_cache_key(arguments)
1950
+
1951
+ # Fallback: simple hash-based key
1952
+ serialized = json.dumps(
1953
+ {"name": function_name, "args": arguments}, sort_keys=True
1954
+ )
1955
+ return hashlib.md5(serialized.encode()).hexdigest()
1956
+
1957
+ def _validate_parameters(
1958
+ self, function_name: str, arguments: dict
1959
+ ) -> Optional[ToolError]:
1960
+ """Validate parameters by delegating to BaseTool."""
1961
+ if function_name not in self.all_tool_dict:
1962
+ return ToolUnavailableError(f"Tool '{function_name}' not found")
1963
+
1964
+ tool_instance = self._get_tool_instance(function_name, cache=False)
1965
+ if not tool_instance:
1966
+ return ToolConfigError("Failed to initialize tool for validation")
1967
+
1968
+ # Check if tool has validate_parameters method (for backward compatibility)
1969
+ if hasattr(tool_instance, "validate_parameters"):
1970
+ return tool_instance.validate_parameters(arguments)
1971
+ else:
1972
+ # Fallback for old-style tools without validate_parameters
1973
+ # Just return None (no validation) to maintain backward compatibility
1974
+ return None
1975
+
1976
+ def _check_basic_type(self, value: Any, expected_type: str) -> bool:
1977
+ """Check if value matches expected basic type."""
1978
+ type_mapping = {
1979
+ "string": str,
1980
+ "integer": int,
1981
+ "number": (int, float),
1982
+ "boolean": bool,
1983
+ "object": dict,
1984
+ "array": list,
1985
+ }
1986
+
1987
+ if expected_type not in type_mapping:
1988
+ return True # Unknown type, skip validation
1989
+
1990
+ expected_python_type = type_mapping[expected_type]
1991
+ return isinstance(value, expected_python_type)
1992
+
1993
+ def _classify_exception(
1994
+ self, exception: Exception, function_name: str, arguments: dict
1995
+ ) -> ToolError:
1996
+ """Classify exception by delegating to BaseTool."""
1997
+ tool_instance = self._get_tool_instance(function_name, cache=False)
1998
+
1999
+ if tool_instance:
2000
+ return tool_instance.handle_error(exception)
2001
+
2002
+ # Fallback for tool instance creation failure
2003
+ return ToolServerError(f"Unexpected error calling {function_name}: {exception}")
2004
+
2005
+ def _create_dual_format_error(self, error: ToolError) -> dict:
2006
+ """Create dual-format error response for backward compatibility."""
2007
+ return {
2008
+ "error": str(error), # Backward compatible string
2009
+ "error_details": error.to_dict(), # New structured format
2010
+ }
2011
+
2012
+ def refresh_tools(self):
2013
+ """Refresh tool discovery (re-discover MCP/remote tools, reload configs)."""
2014
+ # TODO: Implement MCP tool re-discovery
2015
+ # For now, just reload tool configurations
2016
+ self.logger.info("Refreshing tool configurations...")
2017
+ # This could be extended to re-discover MCP tools, reload configs, etc.
2018
+ self.logger.info("Tool refresh completed")
2019
+
2020
+ def eager_load_tools(self, names: Optional[List[str]] = None):
2021
+ """Pre-instantiate tools to reduce first-call latency."""
2022
+ tool_names = names or list(self.all_tool_dict.keys())
2023
+ self.logger.info(f"Eager loading {len(tool_names)} tools...")
2024
+
2025
+ for tool_name in tool_names:
2026
+ if (
2027
+ tool_name in self.all_tool_dict
2028
+ and tool_name not in self.callable_functions
2029
+ ):
2030
+ try:
2031
+ self.init_tool(self.all_tool_dict[tool_name], add_to_cache=True)
2032
+ self.logger.debug(f"Eager loaded: {tool_name}")
2033
+ except Exception as e:
2034
+ self.logger.warning(f"Failed to eager load {tool_name}: {e}")
2035
+
2036
+ self.logger.info(
2037
+ f"Eager loading completed. {len(self.callable_functions)} tools cached."
2038
+ )
2039
+
2040
+ def clear_cache(self):
2041
+ """Clear the result cache."""
2042
+ self._cache.clear()
2043
+ self.logger.info("Result cache cleared")
2044
+
2045
+ def get_tool_health(self, tool_name: str = None) -> dict:
2046
+ """Get health status for tool(s)."""
2047
+ tool_errors = get_tool_errors()
2048
+
2049
+ if tool_name:
2050
+ if tool_name in tool_errors:
2051
+ return tool_errors[tool_name]
2052
+ elif tool_name in self.all_tool_dict:
2053
+ return {"available": True}
2054
+ return {"available": False, "error": "Not found"}
2055
+
2056
+ # Summary for all tools
2057
+ return {
2058
+ "total": len(self.all_tool_dict),
2059
+ "available": len(self.all_tool_dict) - len(tool_errors),
2060
+ "unavailable": len(tool_errors),
2061
+ "unavailable_list": list(tool_errors.keys()),
2062
+ "details": tool_errors,
2063
+ }
1907
2064
 
1908
2065
  def check_function_call(self, fcall_str, function_config=None, format="llama"):
1909
2066
  """
@@ -1986,6 +2143,66 @@ class ToolUniverse:
1986
2143
  self.logger.error(f"Error exporting tool names to {output_file}: {e}")
1987
2144
  return []
1988
2145
 
2146
+ def filter_tools(
2147
+ self,
2148
+ include_tools=None,
2149
+ exclude_tools=None,
2150
+ include_tool_types=None,
2151
+ exclude_tool_types=None,
2152
+ ):
2153
+ """
2154
+ Filter tools based on inclusion/exclusion criteria.
2155
+
2156
+ Args:
2157
+ include_tools (set, optional): Set of tool names to include
2158
+ exclude_tools (set, optional): Set of tool names to exclude
2159
+ include_tool_types (set, optional): Set of tool types to include
2160
+ exclude_tool_types (set, optional): Set of tool types to exclude
2161
+
2162
+ Returns:
2163
+ list: Filtered list of tool configurations
2164
+ """
2165
+ if not hasattr(self, "all_tools") or not self.all_tools:
2166
+ self.logger.warning("No tools loaded. Call load_tools() first.")
2167
+ return []
2168
+
2169
+ filtered_tools = []
2170
+ for tool in self.all_tools:
2171
+ tool_name = tool.get("name", "")
2172
+ tool_type = tool.get("type", "")
2173
+
2174
+ # Check inclusion/exclusion criteria
2175
+ if include_tools and tool_name not in include_tools:
2176
+ continue
2177
+ if exclude_tools and tool_name in exclude_tools:
2178
+ continue
2179
+ if include_tool_types and tool_type not in include_tool_types:
2180
+ continue
2181
+ if exclude_tool_types and tool_type in exclude_tool_types:
2182
+ continue
2183
+
2184
+ filtered_tools.append(tool)
2185
+
2186
+ return filtered_tools
2187
+
2188
+ def get_required_parameters(self, tool_name):
2189
+ """
2190
+ Get required parameters for a specific tool.
2191
+
2192
+ Args:
2193
+ tool_name (str): Name of the tool
2194
+
2195
+ Returns:
2196
+ list: List of required parameter names
2197
+ """
2198
+ if tool_name not in self.all_tool_dict:
2199
+ self.logger.warning(f"Tool '{tool_name}' not found")
2200
+ return []
2201
+
2202
+ tool_config = self.all_tool_dict[tool_name]
2203
+ parameter_schema = tool_config.get("parameter", {})
2204
+ return parameter_schema.get("required", [])
2205
+
1989
2206
  def get_available_tools(self, category_filter=None, name_only=True):
1990
2207
  """
1991
2208
  Get available tools, optionally filtered by category.
@@ -2057,10 +2274,209 @@ class ToolUniverse:
2057
2274
  )
2058
2275
  return matching_tools
2059
2276
 
2277
+ # ============ DEPRECATED METHODS (Kept for backward compatibility) ============
2278
+ # These methods are deprecated and will be removed in v2.0. Use the recommended
2279
+ # alternatives instead. All methods below maintain backward compatibility but
2280
+ # issue deprecation warnings when called.
2281
+
2282
+ def get_tool_by_name(self, tool_names, format="default"):
2283
+ """
2284
+ Retrieve tool configurations by their names.
2285
+
2286
+ DEPRECATED: Use tool_specification() instead.
2287
+
2288
+ Args:
2289
+ tool_names (list): List of tool names to retrieve.
2290
+ format (str, optional): Output format. Options: 'default', 'openai'.
2291
+ If 'openai', returns OpenAI function calling format. Defaults to 'default'.
2292
+
2293
+ Returns:
2294
+ list: List of tool configurations for the specified names.
2295
+ Tools not found will be reported but not included in the result.
2296
+ """
2297
+ warnings.warn(
2298
+ "get_tool_by_name() is deprecated and will be removed in v2.0. "
2299
+ "Use tool_specification() instead.",
2300
+ DeprecationWarning,
2301
+ stacklevel=2,
2302
+ )
2303
+ return self.get_tool_specification_by_names(tool_names, format=format)
2304
+
2305
+ def get_tool_description(self, tool_name):
2306
+ """
2307
+ Get the description of a tool by its name.
2308
+
2309
+ DEPRECATED: Use tool_specification() instead.
2310
+
2311
+ Args:
2312
+ tool_name (str): Name of the tool.
2313
+
2314
+ Returns:
2315
+ dict or None: Tool configuration if found, None otherwise.
2316
+ """
2317
+ warnings.warn(
2318
+ "get_tool_description() is deprecated and will be removed in v2.0. "
2319
+ "Use tool_specification() instead.",
2320
+ DeprecationWarning,
2321
+ stacklevel=2,
2322
+ )
2323
+ return self.get_one_tool_by_one_name(tool_name)
2324
+
2325
+ def remove_keys(self, tool_list, invalid_keys):
2326
+ """
2327
+ Remove specified keys from a list of tool configurations.
2328
+
2329
+ DEPRECATED: Use prepare_tool_prompts(mode='custom', valid_keys=...) instead.
2330
+
2331
+ Args:
2332
+ tool_list (list): List of tool configuration dictionaries.
2333
+ invalid_keys (list): List of keys to remove from each tool configuration.
2334
+
2335
+ Returns:
2336
+ list: Deep copy of tool list with specified keys removed.
2337
+ """
2338
+ warnings.warn(
2339
+ "remove_keys() is deprecated and will be removed in v2.0. "
2340
+ "Use prepare_tool_prompts(mode='custom', valid_keys=...) instead.",
2341
+ DeprecationWarning,
2342
+ stacklevel=2,
2343
+ )
2344
+ copied_list = copy.deepcopy(tool_list)
2345
+ for tool in copied_list:
2346
+ # Create a list of keys to avoid modifying the dictionary during iteration
2347
+ for key in list(tool.keys()):
2348
+ if key in invalid_keys:
2349
+ del tool[key]
2350
+ return copied_list
2351
+
2352
+ def prepare_tool_examples(self, tool_list):
2353
+ """
2354
+ Prepare tool configurations for example usage by keeping extended set of keys.
2355
+
2356
+ DEPRECATED: Use prepare_tool_prompts(mode='example') instead.
2357
+
2358
+ Args:
2359
+ tool_list (list): List of tool configuration dictionaries.
2360
+
2361
+ Returns:
2362
+ list: Deep copy of tool list with only example-relevant keys.
2363
+ """
2364
+ warnings.warn(
2365
+ "prepare_tool_examples() is deprecated and will be removed in v2.0. "
2366
+ "Use prepare_tool_prompts(mode='example') instead.",
2367
+ DeprecationWarning,
2368
+ stacklevel=2,
2369
+ )
2370
+ return self.prepare_tool_prompts(tool_list, mode="example")
2371
+
2372
+ def select_tools(
2373
+ self,
2374
+ include_names=None,
2375
+ exclude_names=None,
2376
+ include_categories=None,
2377
+ exclude_categories=None,
2378
+ ):
2379
+ """
2380
+ Select tools based on tool names and/or categories (tool_files keys).
2381
+
2382
+ DEPRECATED: Use filter_tools() instead.
2383
+
2384
+ Args:
2385
+ include_names (list, optional): List of tool names to include. If None, include all.
2386
+ exclude_names (list, optional): List of tool names to exclude.
2387
+ include_categories (list, optional): List of categories (tool_files keys) to include.
2388
+ If None, include all.
2389
+ exclude_categories (list, optional): List of categories (tool_files keys) to exclude.
2390
+
2391
+ Returns:
2392
+ list: List of selected tool configurations.
2393
+ """
2394
+ warnings.warn(
2395
+ "select_tools() is deprecated and will be removed in v2.0. "
2396
+ "Use filter_tools() instead.",
2397
+ DeprecationWarning,
2398
+ stacklevel=2,
2399
+ )
2400
+ selected_tools = []
2401
+ # If categories are specified, use self.tool_category_dicts to filter
2402
+ categories = set(self.tool_category_dicts.keys())
2403
+ if include_categories is not None:
2404
+ categories &= set(include_categories)
2405
+ if exclude_categories is not None:
2406
+ categories -= set(exclude_categories)
2407
+ # Gather tools from selected categories
2408
+ for cat in categories:
2409
+ selected_tools.extend(self.tool_category_dicts[cat])
2410
+ # Further filter by names if needed
2411
+ if include_names is not None:
2412
+ selected_tools = [
2413
+ tool for tool in selected_tools if tool["name"] in include_names
2414
+ ]
2415
+ if exclude_names is not None:
2416
+ selected_tools = [
2417
+ tool for tool in selected_tools if tool["name"] not in exclude_names
2418
+ ]
2419
+ return selected_tools
2420
+
2421
+ def filter_tool_lists(
2422
+ self,
2423
+ tool_name_list,
2424
+ tool_desc_list,
2425
+ include_names=None,
2426
+ exclude_names=None,
2427
+ include_categories=None,
2428
+ exclude_categories=None,
2429
+ ):
2430
+ """
2431
+ Directly filter tool name and description lists based on names and/or categories.
2432
+
2433
+ DEPRECATED: Use filter_tools() and manual list filtering instead.
2434
+
2435
+ Args:
2436
+ tool_name_list (list): List of tool names to filter.
2437
+ tool_desc_list (list): List of tool descriptions to filter (must correspond to tool_name_list).
2438
+ include_names (list, optional): List of tool names to include.
2439
+ exclude_names (list, optional): List of tool names to exclude.
2440
+ include_categories (list, optional): List of categories to include.
2441
+ exclude_categories (list, optional): List of categories to exclude.
2442
+
2443
+ Returns:
2444
+ tuple: A tuple containing (filtered_tool_name_list, filtered_tool_desc_list).
2445
+ """
2446
+ warnings.warn(
2447
+ "filter_tool_lists() is deprecated and will be removed in v2.0. "
2448
+ "Use filter_tools() and manual list filtering instead.",
2449
+ DeprecationWarning,
2450
+ stacklevel=2,
2451
+ )
2452
+ # Build a set of allowed tool names using select_tools for category filtering
2453
+ allowed_names = set()
2454
+ if any([include_names, exclude_names, include_categories, exclude_categories]):
2455
+ filtered_tools = self.select_tools(
2456
+ include_names=include_names,
2457
+ exclude_names=exclude_names,
2458
+ include_categories=include_categories,
2459
+ exclude_categories=exclude_categories,
2460
+ )
2461
+ allowed_names = set(tool["name"] for tool in filtered_tools)
2462
+ else:
2463
+ allowed_names = set(tool_name_list)
2464
+
2465
+ # Filter lists by allowed_names
2466
+ filtered_tool_name_list = []
2467
+ filtered_tool_desc_list = []
2468
+ for name, desc in zip(tool_name_list, tool_desc_list):
2469
+ if name in allowed_names:
2470
+ filtered_tool_name_list.append(name)
2471
+ filtered_tool_desc_list.append(desc)
2472
+ return filtered_tool_name_list, filtered_tool_desc_list
2473
+
2060
2474
  def load_tools_from_names_list(self, tool_names, clear_existing=True):
2061
2475
  """
2062
2476
  Load only specific tools by their names.
2063
2477
 
2478
+ DEPRECATED: Use load_tools(include_tools=...) instead.
2479
+
2064
2480
  Args:
2065
2481
  tool_names (list): List of tool names to load
2066
2482
  clear_existing (bool): Whether to clear existing tools first
@@ -2068,6 +2484,12 @@ class ToolUniverse:
2068
2484
  Returns:
2069
2485
  int: Number of tools successfully loaded
2070
2486
  """
2487
+ warnings.warn(
2488
+ "load_tools_from_names_list() is deprecated and will be removed in v2.0. "
2489
+ "Use load_tools(include_tools=...) instead.",
2490
+ DeprecationWarning,
2491
+ stacklevel=2,
2492
+ )
2071
2493
  if clear_existing:
2072
2494
  self.all_tools = []
2073
2495
  self.all_tool_dict = {}