tooluniverse 1.0.5__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 (824) hide show
  1. tooluniverse/__init__.py +70 -0
  2. tooluniverse/agentic_tool.py +121 -15
  3. tooluniverse/arxiv_tool.py +109 -0
  4. tooluniverse/base_tool.py +174 -25
  5. tooluniverse/biorxiv_tool.py +116 -0
  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 +155 -0
  13. tooluniverse/crossref_tool.py +158 -0
  14. tooluniverse/data/agentic_tools.json +1271 -1179
  15. tooluniverse/data/alphafold_tools.json +356 -105
  16. tooluniverse/data/arxiv_tools.json +94 -0
  17. tooluniverse/data/biorxiv_tools.json +75 -0
  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 +113 -0
  23. tooluniverse/data/crossref_tools.json +138 -0
  24. tooluniverse/data/dailymed_tools.json +17 -3
  25. tooluniverse/data/dataset_tools.json +1031 -588
  26. tooluniverse/data/dblp_tools.json +144 -0
  27. tooluniverse/data/disease_target_score_tools.json +20 -10
  28. tooluniverse/data/doaj_tools.json +140 -0
  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 +77 -0
  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 +75 -0
  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 +75 -0
  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 +95 -0
  51. tooluniverse/data/openalex_tools.json +100 -31
  52. tooluniverse/data/opentarget_tools.json +1457 -1372
  53. tooluniverse/data/osf_preprints_tools.json +81 -0
  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 +117 -0
  63. tooluniverse/data/protein_structure_3d_tools.json +138 -0
  64. tooluniverse/data/pubchem_tools.json +37 -12
  65. tooluniverse/data/pubmed_tools.json +133 -0
  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/unpaywall_tools.json +86 -0
  73. tooluniverse/data/url_fetch_tools.json +102 -82
  74. tooluniverse/data/uspto_tools.json +49 -30
  75. tooluniverse/data/wikidata_sparql_tools.json +45 -0
  76. tooluniverse/data/xml_tools.json +3274 -3113
  77. tooluniverse/data/zenodo_tools.json +90 -0
  78. tooluniverse/dblp_tool.py +132 -0
  79. tooluniverse/default_config.py +30 -0
  80. tooluniverse/doaj_tool.py +183 -0
  81. tooluniverse/doctor.py +48 -0
  82. tooluniverse/europe_pmc_tool.py +132 -17
  83. tooluniverse/exceptions.py +170 -0
  84. tooluniverse/execute_function.py +825 -342
  85. tooluniverse/fatcat_tool.py +65 -0
  86. tooluniverse/generate_tools.py +198 -0
  87. tooluniverse/hal_tool.py +77 -0
  88. tooluniverse/llm_clients.py +283 -20
  89. tooluniverse/mcp_tool_registry.py +4 -1
  90. tooluniverse/medrxiv_tool.py +116 -0
  91. tooluniverse/memory_manager.py +166 -0
  92. tooluniverse/molecule_2d_tool.py +274 -0
  93. tooluniverse/molecule_3d_tool.py +441 -0
  94. tooluniverse/odphp_tool.py +49 -14
  95. tooluniverse/openaire_tool.py +130 -0
  96. tooluniverse/openalex_tool.py +34 -0
  97. tooluniverse/osf_preprints_tool.py +67 -0
  98. tooluniverse/pmc_tool.py +179 -0
  99. tooluniverse/protein_structure_3d_tool.py +295 -0
  100. tooluniverse/pubmed_tool.py +173 -0
  101. tooluniverse/remote/boltz/boltz_mcp_server.py +3 -1
  102. tooluniverse/remote/uspto_downloader/uspto_downloader_mcp_server.py +3 -1
  103. tooluniverse/semantic_scholar_tool.py +40 -10
  104. tooluniverse/smcp.py +228 -263
  105. tooluniverse/smcp_server.py +97 -55
  106. tooluniverse/tool_registry.py +35 -3
  107. tooluniverse/tools/ADMETAI_predict_BBB_penetrance.py +46 -0
  108. tooluniverse/tools/ADMETAI_predict_CYP_interactions.py +46 -0
  109. tooluniverse/tools/ADMETAI_predict_bioavailability.py +46 -0
  110. tooluniverse/tools/ADMETAI_predict_clearance_distribution.py +49 -0
  111. tooluniverse/tools/ADMETAI_predict_nuclear_receptor_activity.py +49 -0
  112. tooluniverse/tools/ADMETAI_predict_physicochemical_properties.py +49 -0
  113. tooluniverse/tools/ADMETAI_predict_solubility_lipophilicity_hydration.py +49 -0
  114. tooluniverse/tools/ADMETAI_predict_stress_response.py +46 -0
  115. tooluniverse/tools/ADMETAI_predict_toxicity.py +46 -0
  116. tooluniverse/tools/AdvancedCodeQualityAnalyzer.py +63 -0
  117. tooluniverse/tools/AdverseEventICDMapper.py +46 -0
  118. tooluniverse/tools/AdverseEventPredictionQuestionGenerator.py +52 -0
  119. tooluniverse/tools/AdverseEventPredictionQuestionGeneratorWithContext.py +59 -0
  120. tooluniverse/tools/ArXiv_search_papers.py +63 -0
  121. tooluniverse/tools/ArgumentDescriptionOptimizer.py +55 -0
  122. tooluniverse/tools/BioRxiv_search_preprints.py +52 -0
  123. tooluniverse/tools/BiomarkerDiscoveryWorkflow.py +55 -0
  124. tooluniverse/tools/CORE_search_papers.py +67 -0
  125. tooluniverse/tools/CallAgent.py +46 -0
  126. tooluniverse/tools/ChEMBL_search_similar_molecules.py +59 -0
  127. tooluniverse/tools/CodeOptimizer.py +55 -0
  128. tooluniverse/tools/CodeQualityAnalyzer.py +71 -0
  129. tooluniverse/tools/ComprehensiveDrugDiscoveryPipeline.py +49 -0
  130. tooluniverse/tools/Crossref_search_works.py +55 -0
  131. tooluniverse/tools/DBLP_search_publications.py +52 -0
  132. tooluniverse/tools/DOAJ_search_articles.py +55 -0
  133. tooluniverse/tools/DailyMed_get_spl_by_setid.py +52 -0
  134. tooluniverse/tools/DailyMed_search_spls.py +79 -0
  135. tooluniverse/tools/DataAnalysisValidityReviewer.py +49 -0
  136. tooluniverse/tools/DescriptionAnalyzer.py +55 -0
  137. tooluniverse/tools/DescriptionQualityEvaluator.py +59 -0
  138. tooluniverse/tools/DomainExpertValidator.py +63 -0
  139. tooluniverse/tools/DrugSafetyAnalyzer.py +59 -0
  140. tooluniverse/tools/EthicalComplianceReviewer.py +49 -0
  141. tooluniverse/tools/EuropePMC_Guidelines_Search.py +52 -0
  142. tooluniverse/tools/EuropePMC_search_articles.py +52 -0
  143. tooluniverse/tools/ExperimentalDesignScorer.py +55 -0
  144. tooluniverse/tools/FAERS_count_additive_administration_routes.py +52 -0
  145. tooluniverse/tools/FAERS_count_additive_adverse_reactions.py +71 -0
  146. tooluniverse/tools/FAERS_count_additive_event_reports_by_country.py +63 -0
  147. tooluniverse/tools/FAERS_count_additive_reaction_outcomes.py +63 -0
  148. tooluniverse/tools/FAERS_count_additive_reports_by_reporter_country.py +63 -0
  149. tooluniverse/tools/FAERS_count_additive_seriousness_classification.py +63 -0
  150. tooluniverse/tools/FAERS_count_country_by_drug_event.py +63 -0
  151. tooluniverse/tools/FAERS_count_death_related_by_drug.py +49 -0
  152. tooluniverse/tools/FAERS_count_drug_routes_by_event.py +52 -0
  153. tooluniverse/tools/FAERS_count_drugs_by_drug_event.py +63 -0
  154. tooluniverse/tools/FAERS_count_outcomes_by_drug_event.py +63 -0
  155. tooluniverse/tools/FAERS_count_patient_age_distribution.py +49 -0
  156. tooluniverse/tools/FAERS_count_reactions_by_drug_event.py +71 -0
  157. tooluniverse/tools/FAERS_count_reportercountry_by_drug_event.py +63 -0
  158. tooluniverse/tools/FAERS_count_seriousness_by_drug_event.py +63 -0
  159. tooluniverse/tools/FDA_get_abuse_dependence_info_by_drug_name.py +55 -0
  160. tooluniverse/tools/FDA_get_abuse_info_by_drug_name.py +55 -0
  161. tooluniverse/tools/FDA_get_accessories_info_by_drug_name.py +55 -0
  162. tooluniverse/tools/FDA_get_active_ingredient_info_by_drug_name.py +55 -0
  163. tooluniverse/tools/FDA_get_adverse_reactions_by_drug_name.py +55 -0
  164. tooluniverse/tools/FDA_get_alarms_by_drug_name.py +55 -0
  165. tooluniverse/tools/FDA_get_animal_pharmacology_info_by_drug_name.py +55 -0
  166. tooluniverse/tools/FDA_get_assembly_installation_info_by_drug_name.py +55 -0
  167. tooluniverse/tools/FDA_get_boxed_warning_info_by_drug_name.py +55 -0
  168. tooluniverse/tools/FDA_get_brand_name_generic_name.py +52 -0
  169. tooluniverse/tools/FDA_get_calibration_instructions_by_drug_name.py +55 -0
  170. tooluniverse/tools/FDA_get_carcinogenic_mutagenic_fertility_by_drug_name.py +55 -0
  171. tooluniverse/tools/FDA_get_child_safety_info_by_drug_name.py +55 -0
  172. tooluniverse/tools/FDA_get_clinical_pharmacology_by_drug_name.py +55 -0
  173. tooluniverse/tools/FDA_get_clinical_studies_info_by_drug_name.py +55 -0
  174. tooluniverse/tools/FDA_get_contact_for_questions_info_by_drug_name.py +55 -0
  175. tooluniverse/tools/FDA_get_contraindications_by_drug_name.py +55 -0
  176. tooluniverse/tools/FDA_get_controlled_substance_DEA_schedule_info_by_drug_name.py +55 -0
  177. tooluniverse/tools/FDA_get_dear_health_care_provider_letter_info_by_drug_name.py +55 -0
  178. tooluniverse/tools/FDA_get_dependence_info_by_drug_name.py +55 -0
  179. tooluniverse/tools/FDA_get_disposal_info_by_drug_name.py +55 -0
  180. tooluniverse/tools/FDA_get_do_not_use_info_by_drug_name.py +55 -0
  181. tooluniverse/tools/FDA_get_document_id_by_drug_name.py +55 -0
  182. tooluniverse/tools/FDA_get_dosage_and_storage_information_by_drug_name.py +55 -0
  183. tooluniverse/tools/FDA_get_dosage_forms_and_strengths_by_drug_name.py +55 -0
  184. tooluniverse/tools/FDA_get_drug_generic_name.py +46 -0
  185. tooluniverse/tools/FDA_get_drug_interactions_by_drug_name.py +55 -0
  186. tooluniverse/tools/FDA_get_drug_name_by_SPL_ID.py +55 -0
  187. tooluniverse/tools/FDA_get_drug_name_by_adverse_reaction.py +59 -0
  188. tooluniverse/tools/FDA_get_drug_name_by_calibration_instructions.py +59 -0
  189. tooluniverse/tools/FDA_get_drug_name_by_dependence_info.py +59 -0
  190. tooluniverse/tools/FDA_get_drug_name_by_document_id.py +55 -0
  191. tooluniverse/tools/FDA_get_drug_name_by_dosage_info.py +55 -0
  192. tooluniverse/tools/FDA_get_drug_name_by_environmental_warning.py +59 -0
  193. tooluniverse/tools/FDA_get_drug_name_by_inactive_ingredient.py +59 -0
  194. tooluniverse/tools/FDA_get_drug_name_by_info_on_conditions_for_doctor_consultation.py +55 -0
  195. tooluniverse/tools/FDA_get_drug_name_by_labor_and_delivery_info.py +59 -0
  196. tooluniverse/tools/FDA_get_drug_name_by_microbiology.py +59 -0
  197. tooluniverse/tools/FDA_get_drug_name_by_other_safety_info.py +55 -0
  198. tooluniverse/tools/FDA_get_drug_name_by_pharmacodynamics.py +59 -0
  199. tooluniverse/tools/FDA_get_drug_name_by_pharmacogenomics.py +59 -0
  200. tooluniverse/tools/FDA_get_drug_name_by_precautions.py +55 -0
  201. tooluniverse/tools/FDA_get_drug_name_by_pregnancy_or_breastfeeding_info.py +59 -0
  202. tooluniverse/tools/FDA_get_drug_name_by_principal_display_panel.py +59 -0
  203. tooluniverse/tools/FDA_get_drug_name_by_reference.py +55 -0
  204. tooluniverse/tools/FDA_get_drug_name_by_set_id.py +55 -0
  205. tooluniverse/tools/FDA_get_drug_name_by_stop_use_info.py +55 -0
  206. tooluniverse/tools/FDA_get_drug_name_by_storage_and_handling_info.py +55 -0
  207. tooluniverse/tools/FDA_get_drug_name_by_warnings.py +55 -0
  208. tooluniverse/tools/FDA_get_drug_name_from_patient_package_insert.py +59 -0
  209. tooluniverse/tools/FDA_get_drug_names_by_abuse_dependence_info.py +55 -0
  210. tooluniverse/tools/FDA_get_drug_names_by_abuse_info.py +63 -0
  211. tooluniverse/tools/FDA_get_drug_names_by_accessories.py +63 -0
  212. tooluniverse/tools/FDA_get_drug_names_by_active_ingredient.py +63 -0
  213. tooluniverse/tools/FDA_get_drug_names_by_alarm.py +63 -0
  214. tooluniverse/tools/FDA_get_drug_names_by_animal_pharmacology_info.py +63 -0
  215. tooluniverse/tools/FDA_get_drug_names_by_application_number_NDC_number.py +59 -0
  216. tooluniverse/tools/FDA_get_drug_names_by_assembly_installation_info.py +63 -0
  217. tooluniverse/tools/FDA_get_drug_names_by_boxed_warning.py +63 -0
  218. tooluniverse/tools/FDA_get_drug_names_by_child_safety_info.py +63 -0
  219. tooluniverse/tools/FDA_get_drug_names_by_clinical_pharmacology.py +63 -0
  220. tooluniverse/tools/FDA_get_drug_names_by_clinical_studies.py +63 -0
  221. tooluniverse/tools/FDA_get_drug_names_by_consulting_doctor_pharmacist_info.py +63 -0
  222. tooluniverse/tools/FDA_get_drug_names_by_contraindications.py +63 -0
  223. tooluniverse/tools/FDA_get_drug_names_by_controlled_substance_DEA_schedule.py +63 -0
  224. tooluniverse/tools/FDA_get_drug_names_by_dear_health_care_provider_letter_info.py +63 -0
  225. tooluniverse/tools/FDA_get_drug_names_by_disposal_info.py +63 -0
  226. tooluniverse/tools/FDA_get_drug_names_by_dosage_forms_and_strengths_info.py +63 -0
  227. tooluniverse/tools/FDA_get_drug_names_by_drug_interactions.py +63 -0
  228. tooluniverse/tools/FDA_get_drug_names_by_effective_time.py +63 -0
  229. tooluniverse/tools/FDA_get_drug_names_by_food_safety_warnings.py +63 -0
  230. tooluniverse/tools/FDA_get_drug_names_by_general_precautions.py +63 -0
  231. tooluniverse/tools/FDA_get_drug_names_by_geriatric_use.py +63 -0
  232. tooluniverse/tools/FDA_get_drug_names_by_health_claim.py +63 -0
  233. tooluniverse/tools/FDA_get_drug_names_by_indication.py +55 -0
  234. tooluniverse/tools/FDA_get_drug_names_by_info_for_nursing_mothers.py +63 -0
  235. tooluniverse/tools/FDA_get_drug_names_by_information_for_owners_or_caregivers.py +63 -0
  236. tooluniverse/tools/FDA_get_drug_names_by_ingredient.py +63 -0
  237. tooluniverse/tools/FDA_get_drug_names_by_instructions_for_use.py +63 -0
  238. tooluniverse/tools/FDA_get_drug_names_by_lab_test_interference.py +63 -0
  239. tooluniverse/tools/FDA_get_drug_names_by_lab_tests.py +63 -0
  240. tooluniverse/tools/FDA_get_drug_names_by_mechanism_of_action.py +63 -0
  241. tooluniverse/tools/FDA_get_drug_names_by_medication_guide.py +63 -0
  242. tooluniverse/tools/FDA_get_drug_names_by_nonclinical_toxicology_info.py +63 -0
  243. tooluniverse/tools/FDA_get_drug_names_by_nonteratogenic_effects.py +63 -0
  244. tooluniverse/tools/FDA_get_drug_names_by_overdosage_info.py +63 -0
  245. tooluniverse/tools/FDA_get_drug_names_by_pediatric_use.py +63 -0
  246. tooluniverse/tools/FDA_get_drug_names_by_pharmacokinetics.py +63 -0
  247. tooluniverse/tools/FDA_get_drug_names_by_population_use.py +63 -0
  248. tooluniverse/tools/FDA_get_drug_names_by_pregnancy_effects_info.py +63 -0
  249. tooluniverse/tools/FDA_get_drug_names_by_residue_warning.py +63 -0
  250. tooluniverse/tools/FDA_get_drug_names_by_risk.py +63 -0
  251. tooluniverse/tools/FDA_get_drug_names_by_route.py +63 -0
  252. tooluniverse/tools/FDA_get_drug_names_by_safe_handling_warning.py +63 -0
  253. tooluniverse/tools/FDA_get_drug_names_by_safety_summary.py +63 -0
  254. tooluniverse/tools/FDA_get_drug_names_by_spl_indexing_data_elements.py +63 -0
  255. tooluniverse/tools/FDA_get_drug_names_by_teratogenic_effects.py +63 -0
  256. tooluniverse/tools/FDA_get_drug_names_by_user_safety_warning.py +63 -0
  257. tooluniverse/tools/FDA_get_drug_names_by_warnings_and_cautions.py +63 -0
  258. tooluniverse/tools/FDA_get_drugs_by_carcinogenic_mutagenic_fertility.py +63 -0
  259. tooluniverse/tools/FDA_get_effective_time_by_drug_name.py +55 -0
  260. tooluniverse/tools/FDA_get_environmental_warning_by_drug_name.py +55 -0
  261. tooluniverse/tools/FDA_get_general_precautions_by_drug_name.py +55 -0
  262. tooluniverse/tools/FDA_get_geriatric_use_info_by_drug_name.py +55 -0
  263. tooluniverse/tools/FDA_get_health_claims_by_drug_name.py +55 -0
  264. tooluniverse/tools/FDA_get_inactive_ingredient_info_by_drug_name.py +55 -0
  265. tooluniverse/tools/FDA_get_indications_by_drug_name.py +55 -0
  266. tooluniverse/tools/FDA_get_info_for_nursing_mothers_by_drug_name.py +55 -0
  267. tooluniverse/tools/FDA_get_info_for_patients_by_drug_name.py +55 -0
  268. tooluniverse/tools/FDA_get_info_on_conditions_for_doctor_consultation_by_drug_name.py +55 -0
  269. tooluniverse/tools/FDA_get_info_on_consulting_doctor_pharmacist_by_drug_name.py +55 -0
  270. tooluniverse/tools/FDA_get_information_for_owners_or_caregivers_by_drug_name.py +55 -0
  271. tooluniverse/tools/FDA_get_ingredients_by_drug_name.py +55 -0
  272. tooluniverse/tools/FDA_get_instructions_for_use_by_drug_name.py +55 -0
  273. tooluniverse/tools/FDA_get_lab_test_interference_info_by_drug_name.py +55 -0
  274. tooluniverse/tools/FDA_get_lab_tests_by_drug_name.py +55 -0
  275. tooluniverse/tools/FDA_get_labor_and_delivery_info_by_drug_name.py +55 -0
  276. tooluniverse/tools/FDA_get_manufacturer_name_NDC_number_by_drug_name.py +55 -0
  277. tooluniverse/tools/FDA_get_mechanism_of_action_by_drug_name.py +55 -0
  278. tooluniverse/tools/FDA_get_medication_guide_info_by_drug_name.py +55 -0
  279. tooluniverse/tools/FDA_get_microbiology_info_by_drug_name.py +55 -0
  280. tooluniverse/tools/FDA_get_nonclinical_toxicology_info_by_drug_name.py +55 -0
  281. tooluniverse/tools/FDA_get_nonteratogenic_effects_by_drug_name.py +55 -0
  282. tooluniverse/tools/FDA_get_other_safety_info_by_drug_name.py +55 -0
  283. tooluniverse/tools/FDA_get_overdosage_info_by_drug_name.py +55 -0
  284. tooluniverse/tools/FDA_get_patient_package_insert_from_drug_name.py +55 -0
  285. tooluniverse/tools/FDA_get_pediatric_use_info_by_drug_name.py +55 -0
  286. tooluniverse/tools/FDA_get_pharmacodynamics_by_drug_name.py +55 -0
  287. tooluniverse/tools/FDA_get_pharmacogenomics_info_by_drug_name.py +55 -0
  288. tooluniverse/tools/FDA_get_pharmacokinetics_by_drug_name.py +55 -0
  289. tooluniverse/tools/FDA_get_population_use_info_by_drug_name.py +55 -0
  290. tooluniverse/tools/FDA_get_precautions_by_drug_name.py +55 -0
  291. tooluniverse/tools/FDA_get_pregnancy_effects_info_by_drug_name.py +55 -0
  292. tooluniverse/tools/FDA_get_pregnancy_or_breastfeeding_info_by_drug_name.py +55 -0
  293. tooluniverse/tools/FDA_get_principal_display_panel_by_drug_name.py +55 -0
  294. tooluniverse/tools/FDA_get_purpose_info_by_drug_name.py +55 -0
  295. tooluniverse/tools/FDA_get_recent_changes_by_drug_name.py +55 -0
  296. tooluniverse/tools/FDA_get_reference_info_by_drug_name.py +55 -0
  297. tooluniverse/tools/FDA_get_residue_warning_by_drug_name.py +55 -0
  298. tooluniverse/tools/FDA_get_risk_info_by_drug_name.py +55 -0
  299. tooluniverse/tools/FDA_get_route_info_by_drug_name.py +55 -0
  300. tooluniverse/tools/FDA_get_safe_handling_warnings_by_drug_name.py +55 -0
  301. tooluniverse/tools/FDA_get_safety_summary_by_drug_name.py +55 -0
  302. tooluniverse/tools/FDA_get_spl_indexing_data_elements_by_drug_name.py +55 -0
  303. tooluniverse/tools/FDA_get_spl_unclassified_section_by_drug_name.py +55 -0
  304. tooluniverse/tools/FDA_get_stop_use_info_by_drug_name.py +55 -0
  305. tooluniverse/tools/FDA_get_storage_and_handling_info_by_drug_name.py +55 -0
  306. tooluniverse/tools/FDA_get_teratogenic_effects_by_drug_name.py +55 -0
  307. tooluniverse/tools/FDA_get_user_safety_warning_by_drug_names.py +55 -0
  308. tooluniverse/tools/FDA_get_warnings_and_cautions_by_drug_name.py +55 -0
  309. tooluniverse/tools/FDA_get_warnings_by_drug_name.py +55 -0
  310. tooluniverse/tools/FDA_get_when_using_info.py +55 -0
  311. tooluniverse/tools/FDA_retrieve_device_use_by_drug_name.py +55 -0
  312. tooluniverse/tools/FDA_retrieve_drug_name_by_device_use.py +59 -0
  313. tooluniverse/tools/FDA_retrieve_drug_names_by_patient_medication_info.py +55 -0
  314. tooluniverse/tools/FDA_retrieve_patient_medication_info_by_drug_name.py +55 -0
  315. tooluniverse/tools/Fatcat_search_scholar.py +52 -0
  316. tooluniverse/tools/Finish.py +44 -0
  317. tooluniverse/tools/GO_get_annotations_for_gene.py +46 -0
  318. tooluniverse/tools/GO_get_genes_for_term.py +55 -0
  319. tooluniverse/tools/GO_get_term_by_id.py +46 -0
  320. tooluniverse/tools/GO_get_term_details.py +46 -0
  321. tooluniverse/tools/GO_search_terms.py +46 -0
  322. tooluniverse/tools/HAL_search_archive.py +52 -0
  323. tooluniverse/tools/HPA_get_biological_processes_by_gene.py +52 -0
  324. tooluniverse/tools/HPA_get_cancer_prognostics_by_gene.py +49 -0
  325. tooluniverse/tools/HPA_get_comparative_expression_by_gene_and_cellline.py +52 -0
  326. tooluniverse/tools/HPA_get_comprehensive_gene_details_by_ensembl_id.py +63 -0
  327. tooluniverse/tools/HPA_get_contextual_biological_process_analysis.py +52 -0
  328. tooluniverse/tools/HPA_get_disease_expression_by_gene_tissue_disease.py +59 -0
  329. tooluniverse/tools/HPA_get_gene_basic_info_by_ensembl_id.py +49 -0
  330. tooluniverse/tools/HPA_get_gene_tsv_data_by_ensembl_id.py +49 -0
  331. tooluniverse/tools/HPA_get_protein_interactions_by_gene.py +49 -0
  332. tooluniverse/tools/HPA_get_rna_expression_by_source.py +59 -0
  333. tooluniverse/tools/HPA_get_rna_expression_in_specific_tissues.py +52 -0
  334. tooluniverse/tools/HPA_get_subcellular_location.py +46 -0
  335. tooluniverse/tools/HPA_search_genes_by_query.py +49 -0
  336. tooluniverse/tools/HypothesisGenerator.py +63 -0
  337. tooluniverse/tools/LabelGenerator.py +67 -0
  338. tooluniverse/tools/LiteratureContextReviewer.py +55 -0
  339. tooluniverse/tools/LiteratureSearchTool.py +49 -0
  340. tooluniverse/tools/MedRxiv_search_preprints.py +52 -0
  341. tooluniverse/tools/MedicalLiteratureReviewer.py +71 -0
  342. tooluniverse/tools/MedicalTermNormalizer.py +46 -0
  343. tooluniverse/tools/MedlinePlus_connect_lookup_by_code.py +67 -0
  344. tooluniverse/tools/MedlinePlus_get_genetics_condition_by_name.py +52 -0
  345. tooluniverse/tools/MedlinePlus_get_genetics_gene_by_name.py +52 -0
  346. tooluniverse/tools/MedlinePlus_get_genetics_index.py +44 -0
  347. tooluniverse/tools/MedlinePlus_search_topics_by_keyword.py +55 -0
  348. tooluniverse/tools/MethodologyRigorReviewer.py +49 -0
  349. tooluniverse/tools/MultiAgentLiteratureSearch.py +59 -0
  350. tooluniverse/tools/NICE_Clinical_Guidelines_Search.py +52 -0
  351. tooluniverse/tools/NICE_Guideline_Full_Text.py +46 -0
  352. tooluniverse/tools/NoveltySignificanceReviewer.py +59 -0
  353. tooluniverse/tools/OSF_search_preprints.py +59 -0
  354. tooluniverse/tools/OSL_get_efo_id_by_disease_name.py +46 -0
  355. tooluniverse/tools/OpenAIRE_search_publications.py +55 -0
  356. tooluniverse/tools/OpenAlex_Guidelines_Search.py +63 -0
  357. tooluniverse/tools/OpenTargets_drug_pharmacogenomics_data.py +52 -0
  358. tooluniverse/tools/OpenTargets_get_approved_indications_by_drug_chemblId.py +49 -0
  359. tooluniverse/tools/OpenTargets_get_associated_diseases_by_drug_chemblId.py +49 -0
  360. tooluniverse/tools/OpenTargets_get_associated_drugs_by_disease_efoId.py +52 -0
  361. tooluniverse/tools/OpenTargets_get_associated_drugs_by_target_ensemblID.py +55 -0
  362. tooluniverse/tools/OpenTargets_get_associated_phenotypes_by_disease_efoId.py +49 -0
  363. tooluniverse/tools/OpenTargets_get_associated_targets_by_disease_efoId.py +49 -0
  364. tooluniverse/tools/OpenTargets_get_associated_targets_by_drug_chemblId.py +49 -0
  365. tooluniverse/tools/OpenTargets_get_biological_mouse_models_by_ensemblID.py +49 -0
  366. tooluniverse/tools/OpenTargets_get_chemical_probes_by_target_ensemblID.py +49 -0
  367. tooluniverse/tools/OpenTargets_get_disease_ancestors_parents_by_efoId.py +49 -0
  368. tooluniverse/tools/OpenTargets_get_disease_descendants_children_by_efoId.py +49 -0
  369. tooluniverse/tools/OpenTargets_get_disease_description_by_efoId.py +49 -0
  370. tooluniverse/tools/OpenTargets_get_disease_id_description_by_name.py +49 -0
  371. tooluniverse/tools/OpenTargets_get_disease_ids_by_efoId.py +46 -0
  372. tooluniverse/tools/OpenTargets_get_disease_ids_by_name.py +46 -0
  373. tooluniverse/tools/OpenTargets_get_disease_locations_by_efoId.py +49 -0
  374. tooluniverse/tools/OpenTargets_get_disease_synonyms_by_efoId.py +49 -0
  375. tooluniverse/tools/OpenTargets_get_disease_therapeutic_areas_by_efoId.py +49 -0
  376. tooluniverse/tools/OpenTargets_get_diseases_phenotypes_by_target_ensembl.py +49 -0
  377. tooluniverse/tools/OpenTargets_get_drug_adverse_events_by_chemblId.py +52 -0
  378. tooluniverse/tools/OpenTargets_get_drug_approval_status_by_chemblId.py +49 -0
  379. tooluniverse/tools/OpenTargets_get_drug_chembId_by_generic_name.py +49 -0
  380. tooluniverse/tools/OpenTargets_get_drug_description_by_chemblId.py +49 -0
  381. tooluniverse/tools/OpenTargets_get_drug_id_description_by_name.py +49 -0
  382. tooluniverse/tools/OpenTargets_get_drug_indications_by_chemblId.py +49 -0
  383. tooluniverse/tools/OpenTargets_get_drug_mechanisms_of_action_by_chemblId.py +49 -0
  384. tooluniverse/tools/OpenTargets_get_drug_synonyms_by_chemblId.py +49 -0
  385. tooluniverse/tools/OpenTargets_get_drug_trade_names_by_chemblId.py +49 -0
  386. tooluniverse/tools/OpenTargets_get_drug_warnings_by_chemblId.py +49 -0
  387. tooluniverse/tools/OpenTargets_get_drug_withdrawn_blackbox_status_by_chemblId.py +49 -0
  388. tooluniverse/tools/OpenTargets_get_gene_ontology_terms_by_goID.py +49 -0
  389. tooluniverse/tools/OpenTargets_get_known_drugs_by_drug_chemblId.py +49 -0
  390. tooluniverse/tools/OpenTargets_get_parent_child_molecules_by_drug_chembl_ID.py +49 -0
  391. tooluniverse/tools/OpenTargets_get_publications_by_disease_efoId.py +71 -0
  392. tooluniverse/tools/OpenTargets_get_publications_by_drug_chemblId.py +71 -0
  393. tooluniverse/tools/OpenTargets_get_publications_by_target_ensemblID.py +71 -0
  394. tooluniverse/tools/OpenTargets_get_similar_entities_by_disease_efoId.py +55 -0
  395. tooluniverse/tools/OpenTargets_get_similar_entities_by_drug_chemblId.py +55 -0
  396. tooluniverse/tools/OpenTargets_get_similar_entities_by_target_ensemblID.py +55 -0
  397. tooluniverse/tools/OpenTargets_get_target_classes_by_ensemblID.py +49 -0
  398. tooluniverse/tools/OpenTargets_get_target_constraint_info_by_ensemblID.py +49 -0
  399. tooluniverse/tools/OpenTargets_get_target_enabling_packages_by_ensemblID.py +49 -0
  400. tooluniverse/tools/OpenTargets_get_target_gene_ontology_by_ensemblID.py +49 -0
  401. tooluniverse/tools/OpenTargets_get_target_genomic_location_by_ensemblID.py +49 -0
  402. tooluniverse/tools/OpenTargets_get_target_homologues_by_ensemblID.py +49 -0
  403. tooluniverse/tools/OpenTargets_get_target_id_description_by_name.py +49 -0
  404. tooluniverse/tools/OpenTargets_get_target_interactions_by_ensemblID.py +52 -0
  405. tooluniverse/tools/OpenTargets_get_target_safety_profile_by_ensemblID.py +49 -0
  406. tooluniverse/tools/OpenTargets_get_target_subcellular_locations_by_ensemblID.py +49 -0
  407. tooluniverse/tools/OpenTargets_get_target_synonyms_by_ensemblID.py +49 -0
  408. tooluniverse/tools/OpenTargets_get_target_tractability_by_ensemblID.py +49 -0
  409. tooluniverse/tools/OpenTargets_map_any_disease_id_to_all_other_ids.py +49 -0
  410. tooluniverse/tools/OpenTargets_multi_entity_search_by_query_string.py +59 -0
  411. tooluniverse/tools/OpenTargets_search_category_counts_by_query_string.py +49 -0
  412. tooluniverse/tools/OpenTargets_target_disease_evidence.py +52 -0
  413. tooluniverse/tools/OutputSummarizationComposer.py +71 -0
  414. tooluniverse/tools/PMC_search_papers.py +67 -0
  415. tooluniverse/tools/ProtocolOptimizer.py +49 -0
  416. tooluniverse/tools/PubChem_get_CID_by_SMILES.py +46 -0
  417. tooluniverse/tools/PubChem_get_CID_by_compound_name.py +46 -0
  418. tooluniverse/tools/PubChem_get_associated_patents_by_CID.py +46 -0
  419. tooluniverse/tools/PubChem_get_compound_2D_image_by_CID.py +52 -0
  420. tooluniverse/tools/PubChem_get_compound_properties_by_CID.py +46 -0
  421. tooluniverse/tools/PubChem_get_compound_synonyms_by_CID.py +46 -0
  422. tooluniverse/tools/PubChem_get_compound_xrefs_by_CID.py +52 -0
  423. tooluniverse/tools/PubChem_search_compounds_by_similarity.py +52 -0
  424. tooluniverse/tools/PubChem_search_compounds_by_substructure.py +49 -0
  425. tooluniverse/tools/PubMed_Guidelines_Search.py +55 -0
  426. tooluniverse/tools/PubMed_search_articles.py +55 -0
  427. tooluniverse/tools/PubTator3_EntityAutocomplete.py +59 -0
  428. tooluniverse/tools/PubTator3_LiteratureSearch.py +55 -0
  429. tooluniverse/tools/QuestionRephraser.py +52 -0
  430. tooluniverse/tools/Reactome_get_pathway_reactions.py +46 -0
  431. tooluniverse/tools/ReproducibilityTransparencyReviewer.py +49 -0
  432. tooluniverse/tools/ResultsInterpretationReviewer.py +55 -0
  433. tooluniverse/tools/ScientificTextSummarizer.py +59 -0
  434. tooluniverse/tools/SemanticScholar_search_papers.py +55 -0
  435. tooluniverse/tools/TRIP_Database_Guidelines_Search.py +55 -0
  436. tooluniverse/tools/TestCaseGenerator.py +46 -0
  437. tooluniverse/tools/ToolCompatibilityAnalyzer.py +59 -0
  438. tooluniverse/tools/ToolDescriptionOptimizer.py +67 -0
  439. tooluniverse/tools/ToolDiscover.py +63 -0
  440. tooluniverse/tools/ToolGraphComposer.py +71 -0
  441. tooluniverse/tools/ToolGraphGenerationPipeline.py +63 -0
  442. tooluniverse/tools/ToolImplementationGenerator.py +67 -0
  443. tooluniverse/tools/ToolMetadataGenerationPipeline.py +63 -0
  444. tooluniverse/tools/ToolMetadataGenerator.py +55 -0
  445. tooluniverse/tools/ToolMetadataStandardizer.py +52 -0
  446. tooluniverse/tools/ToolOptimizer.py +59 -0
  447. tooluniverse/tools/ToolOutputSummarizer.py +67 -0
  448. tooluniverse/tools/ToolQualityEvaluator.py +59 -0
  449. tooluniverse/tools/ToolRelationshipDetector.py +52 -0
  450. tooluniverse/tools/ToolSpecificationGenerator.py +67 -0
  451. tooluniverse/tools/ToolSpecificationOptimizer.py +63 -0
  452. tooluniverse/tools/Tool_Finder.py +67 -0
  453. tooluniverse/tools/Tool_Finder_Keyword.py +67 -0
  454. tooluniverse/tools/Tool_Finder_LLM.py +67 -0
  455. tooluniverse/tools/Tool_RAG.py +49 -0
  456. tooluniverse/tools/UniProt_get_alternative_names_by_accession.py +49 -0
  457. tooluniverse/tools/UniProt_get_disease_variants_by_accession.py +49 -0
  458. tooluniverse/tools/UniProt_get_entry_by_accession.py +49 -0
  459. tooluniverse/tools/UniProt_get_function_by_accession.py +49 -0
  460. tooluniverse/tools/UniProt_get_isoform_ids_by_accession.py +49 -0
  461. tooluniverse/tools/UniProt_get_organism_by_accession.py +49 -0
  462. tooluniverse/tools/UniProt_get_ptm_processing_by_accession.py +49 -0
  463. tooluniverse/tools/UniProt_get_recommended_name_by_accession.py +49 -0
  464. tooluniverse/tools/UniProt_get_sequence_by_accession.py +49 -0
  465. tooluniverse/tools/UniProt_get_subcellular_location_by_accession.py +49 -0
  466. tooluniverse/tools/Unpaywall_check_oa_status.py +52 -0
  467. tooluniverse/tools/WHO_Guideline_Full_Text.py +46 -0
  468. tooluniverse/tools/WHO_Guidelines_Search.py +52 -0
  469. tooluniverse/tools/Wikidata_SPARQL_query.py +52 -0
  470. tooluniverse/tools/WritingPresentationReviewer.py +49 -0
  471. tooluniverse/tools/Zenodo_search_records.py +59 -0
  472. tooluniverse/tools/__init__.py +1738 -0
  473. tooluniverse/tools/_shared_client.py +138 -0
  474. tooluniverse/tools/alphafold_get_annotations.py +52 -0
  475. tooluniverse/tools/alphafold_get_prediction.py +55 -0
  476. tooluniverse/tools/alphafold_get_summary.py +46 -0
  477. tooluniverse/tools/call_agentic_human.py +46 -0
  478. tooluniverse/tools/cancer_biomarkers_disease_target_score.py +52 -0
  479. tooluniverse/tools/cancer_gene_census_disease_target_score.py +52 -0
  480. tooluniverse/tools/cellosaurus_get_cell_line_info.py +55 -0
  481. tooluniverse/tools/cellosaurus_query_converter.py +52 -0
  482. tooluniverse/tools/cellosaurus_search_cell_lines.py +55 -0
  483. tooluniverse/tools/chembl_disease_target_score.py +52 -0
  484. tooluniverse/tools/dict_search.py +67 -0
  485. tooluniverse/tools/dili_search.py +67 -0
  486. tooluniverse/tools/diqt_search.py +67 -0
  487. tooluniverse/tools/disease_target_score.py +59 -0
  488. tooluniverse/tools/drugbank_filter_drugs_by_name.py +55 -0
  489. tooluniverse/tools/drugbank_full_search.py +67 -0
  490. tooluniverse/tools/drugbank_get_drug_basic_info_by_drug_name_or_drugbank_id.py +63 -0
  491. tooluniverse/tools/drugbank_get_drug_chemistry_by_drug_name_or_drugbank_id.py +63 -0
  492. tooluniverse/tools/drugbank_get_drug_interactions_by_drug_name_or_drugbank_id.py +63 -0
  493. tooluniverse/tools/drugbank_get_drug_name_and_description_by_indication.py +63 -0
  494. tooluniverse/tools/drugbank_get_drug_name_and_description_by_pathway_name.py +63 -0
  495. tooluniverse/tools/drugbank_get_drug_name_and_description_by_target_name.py +63 -0
  496. tooluniverse/tools/drugbank_get_drug_name_description_pharmacology_by_mechanism_of_action.py +63 -0
  497. tooluniverse/tools/drugbank_get_drug_pathways_and_reactions_by_drug_name_or_drugbank_id.py +63 -0
  498. tooluniverse/tools/drugbank_get_drug_products_by_name_or_drugbank_id.py +63 -0
  499. tooluniverse/tools/drugbank_get_drug_references_by_drug_name_or_drugbank_id.py +63 -0
  500. tooluniverse/tools/drugbank_get_indications_by_drug_name_or_drugbank_id.py +63 -0
  501. tooluniverse/tools/drugbank_get_pharmacology_by_drug_name_or_drugbank_id.py +63 -0
  502. tooluniverse/tools/drugbank_get_safety_by_drug_name_or_drugbank_id.py +63 -0
  503. tooluniverse/tools/drugbank_get_targets_by_drug_name_or_drugbank_id.py +63 -0
  504. tooluniverse/tools/drugbank_links_search.py +67 -0
  505. tooluniverse/tools/drugbank_vocab_filter.py +63 -0
  506. tooluniverse/tools/drugbank_vocab_search.py +67 -0
  507. tooluniverse/tools/embedding_database_add.py +63 -0
  508. tooluniverse/tools/embedding_database_create.py +71 -0
  509. tooluniverse/tools/embedding_database_load.py +63 -0
  510. tooluniverse/tools/embedding_database_search.py +67 -0
  511. tooluniverse/tools/embedding_sync_download.py +63 -0
  512. tooluniverse/tools/embedding_sync_upload.py +71 -0
  513. tooluniverse/tools/enrichr_gene_enrichment_analysis.py +52 -0
  514. tooluniverse/tools/europepmc_disease_target_score.py +52 -0
  515. tooluniverse/tools/eva_disease_target_score.py +52 -0
  516. tooluniverse/tools/eva_somatic_disease_target_score.py +52 -0
  517. tooluniverse/tools/expression_atlas_disease_target_score.py +52 -0
  518. tooluniverse/tools/extract_clinical_trial_adverse_events.py +59 -0
  519. tooluniverse/tools/extract_clinical_trial_outcomes.py +52 -0
  520. tooluniverse/tools/genomics_england_disease_target_score.py +52 -0
  521. tooluniverse/tools/get_HPO_ID_by_phenotype.py +55 -0
  522. tooluniverse/tools/get_albumentations_info.py +44 -0
  523. tooluniverse/tools/get_altair_info.py +44 -0
  524. tooluniverse/tools/get_anndata_info.py +49 -0
  525. tooluniverse/tools/get_arboreto_info.py +46 -0
  526. tooluniverse/tools/get_arxiv_info.py +46 -0
  527. tooluniverse/tools/get_ase_info.py +46 -0
  528. tooluniverse/tools/get_assembly_info_by_pdb_id.py +46 -0
  529. tooluniverse/tools/get_assembly_summary.py +46 -0
  530. tooluniverse/tools/get_astropy_info.py +44 -0
  531. tooluniverse/tools/get_binding_affinity_by_pdb_id.py +46 -0
  532. tooluniverse/tools/get_biopandas_info.py +49 -0
  533. tooluniverse/tools/get_biopython_info.py +49 -0
  534. tooluniverse/tools/get_bioservices_info.py +44 -0
  535. tooluniverse/tools/get_biotite_info.py +49 -0
  536. tooluniverse/tools/get_bokeh_info.py +44 -0
  537. tooluniverse/tools/get_brian2_info.py +44 -0
  538. tooluniverse/tools/get_cartopy_info.py +44 -0
  539. tooluniverse/tools/get_catboost_info.py +44 -0
  540. tooluniverse/tools/get_cellpose_info.py +49 -0
  541. tooluniverse/tools/get_cellrank_info.py +44 -0
  542. tooluniverse/tools/get_cellxgene_census_info.py +46 -0
  543. tooluniverse/tools/get_cftime_info.py +44 -0
  544. tooluniverse/tools/get_chem_comp_audit_info.py +46 -0
  545. tooluniverse/tools/get_chem_comp_charge_and_ambiguity.py +46 -0
  546. tooluniverse/tools/get_chembl_webresource_client_info.py +44 -0
  547. tooluniverse/tools/get_citation_info_by_pdb_id.py +46 -0
  548. tooluniverse/tools/get_clair3_info.py +46 -0
  549. tooluniverse/tools/get_clinical_trial_conditions_and_interventions.py +55 -0
  550. tooluniverse/tools/get_clinical_trial_descriptions.py +52 -0
  551. tooluniverse/tools/get_clinical_trial_eligibility_criteria.py +55 -0
  552. tooluniverse/tools/get_clinical_trial_locations.py +52 -0
  553. tooluniverse/tools/get_clinical_trial_outcome_measures.py +52 -0
  554. tooluniverse/tools/get_clinical_trial_references.py +52 -0
  555. tooluniverse/tools/get_clinical_trial_status_and_dates.py +52 -0
  556. tooluniverse/tools/get_cobra_info.py +46 -0
  557. tooluniverse/tools/get_cobrapy_info.py +46 -0
  558. tooluniverse/tools/get_cooler_info.py +49 -0
  559. tooluniverse/tools/get_core_refinement_statistics.py +46 -0
  560. tooluniverse/tools/get_cryosparc_tools_info.py +46 -0
  561. tooluniverse/tools/get_crystal_growth_conditions_by_pdb_id.py +49 -0
  562. tooluniverse/tools/get_crystallization_ph_by_pdb_id.py +46 -0
  563. tooluniverse/tools/get_crystallographic_properties_by_pdb_id.py +49 -0
  564. tooluniverse/tools/get_cupy_info.py +44 -0
  565. tooluniverse/tools/get_cyvcf2_info.py +49 -0
  566. tooluniverse/tools/get_dask_info.py +44 -0
  567. tooluniverse/tools/get_datamol_info.py +44 -0
  568. tooluniverse/tools/get_datashader_info.py +44 -0
  569. tooluniverse/tools/get_deepchem_info.py +49 -0
  570. tooluniverse/tools/get_deeppurpose_info.py +46 -0
  571. tooluniverse/tools/get_deeptools_info.py +46 -0
  572. tooluniverse/tools/get_deepxde_info.py +49 -0
  573. tooluniverse/tools/get_dendropy_info.py +44 -0
  574. tooluniverse/tools/get_descriptastorus_info.py +46 -0
  575. tooluniverse/tools/get_diffdock_info.py +46 -0
  576. tooluniverse/tools/get_dscribe_info.py +49 -0
  577. tooluniverse/tools/get_ec_number_by_entity_id.py +46 -0
  578. tooluniverse/tools/get_elephant_info.py +44 -0
  579. tooluniverse/tools/get_em_3d_fitting_and_reconstruction_details.py +49 -0
  580. tooluniverse/tools/get_emdb_ids_by_pdb_id.py +46 -0
  581. tooluniverse/tools/get_episcanpy_info.py +44 -0
  582. tooluniverse/tools/get_ete3_info.py +44 -0
  583. tooluniverse/tools/get_faiss_info.py +46 -0
  584. tooluniverse/tools/get_fanc_info.py +46 -0
  585. tooluniverse/tools/get_flask_info.py +46 -0
  586. tooluniverse/tools/get_flowio_info.py +46 -0
  587. tooluniverse/tools/get_flowkit_info.py +46 -0
  588. tooluniverse/tools/get_flowutils_info.py +46 -0
  589. tooluniverse/tools/get_freesasa_info.py +44 -0
  590. tooluniverse/tools/get_galpy_info.py +44 -0
  591. tooluniverse/tools/get_gene_name_by_entity_id.py +46 -0
  592. tooluniverse/tools/get_geopandas_info.py +44 -0
  593. tooluniverse/tools/get_gget_info.py +46 -0
  594. tooluniverse/tools/get_googlesearch_python_info.py +46 -0
  595. tooluniverse/tools/get_gseapy_info.py +49 -0
  596. tooluniverse/tools/get_h5py_info.py +46 -0
  597. tooluniverse/tools/get_harmony_pytorch_info.py +46 -0
  598. tooluniverse/tools/get_hmmlearn_info.py +46 -0
  599. tooluniverse/tools/get_holoviews_info.py +44 -0
  600. tooluniverse/tools/get_host_organism_by_pdb_id.py +46 -0
  601. tooluniverse/tools/get_htmd_info.py +44 -0
  602. tooluniverse/tools/get_hyperopt_info.py +49 -0
  603. tooluniverse/tools/get_igraph_info.py +49 -0
  604. tooluniverse/tools/get_imageio_info.py +44 -0
  605. tooluniverse/tools/get_imbalanced_learn_info.py +44 -0
  606. tooluniverse/tools/get_jcvi_info.py +46 -0
  607. tooluniverse/tools/get_joblib_info.py +44 -0
  608. tooluniverse/tools/get_joint_associated_diseases_by_HPO_ID_list.py +55 -0
  609. tooluniverse/tools/get_khmer_info.py +46 -0
  610. tooluniverse/tools/get_kipoiseq_info.py +44 -0
  611. tooluniverse/tools/get_lifelines_info.py +49 -0
  612. tooluniverse/tools/get_ligand_bond_count_by_pdb_id.py +46 -0
  613. tooluniverse/tools/get_ligand_smiles_by_chem_comp_id.py +49 -0
  614. tooluniverse/tools/get_lightgbm_info.py +44 -0
  615. tooluniverse/tools/get_loompy_info.py +46 -0
  616. tooluniverse/tools/get_mageck_info.py +46 -0
  617. tooluniverse/tools/get_matplotlib_info.py +49 -0
  618. tooluniverse/tools/get_mdanalysis_info.py +46 -0
  619. tooluniverse/tools/get_mdtraj_info.py +44 -0
  620. tooluniverse/tools/get_mne_info.py +44 -0
  621. tooluniverse/tools/get_molfeat_info.py +44 -0
  622. tooluniverse/tools/get_molvs_info.py +44 -0
  623. tooluniverse/tools/get_mordred_info.py +44 -0
  624. tooluniverse/tools/get_msprime_info.py +49 -0
  625. tooluniverse/tools/get_mudata_info.py +49 -0
  626. tooluniverse/tools/get_mutation_annotations_by_pdb_id.py +46 -0
  627. tooluniverse/tools/get_neo_info.py +44 -0
  628. tooluniverse/tools/get_netcdf4_info.py +44 -0
  629. tooluniverse/tools/get_networkx_info.py +46 -0
  630. tooluniverse/tools/get_nglview_info.py +44 -0
  631. tooluniverse/tools/get_nilearn_info.py +44 -0
  632. tooluniverse/tools/get_numba_info.py +46 -0
  633. tooluniverse/tools/get_numpy_info.py +46 -0
  634. tooluniverse/tools/get_oligosaccharide_descriptors_by_entity_id.py +49 -0
  635. tooluniverse/tools/get_openbabel_info.py +49 -0
  636. tooluniverse/tools/get_openchem_info.py +46 -0
  637. tooluniverse/tools/get_opencv_info.py +49 -0
  638. tooluniverse/tools/get_openmm_info.py +49 -0
  639. tooluniverse/tools/get_optlang_info.py +46 -0
  640. tooluniverse/tools/get_optuna_info.py +44 -0
  641. tooluniverse/tools/get_palantir_info.py +44 -0
  642. tooluniverse/tools/get_pandas_info.py +49 -0
  643. tooluniverse/tools/get_patsy_info.py +44 -0
  644. tooluniverse/tools/get_pdbfixer_info.py +46 -0
  645. tooluniverse/tools/get_phenotype_by_HPO_ID.py +46 -0
  646. tooluniverse/tools/get_pillow_info.py +44 -0
  647. tooluniverse/tools/get_plantcv_info.py +46 -0
  648. tooluniverse/tools/get_plip_info.py +46 -0
  649. tooluniverse/tools/get_plotly_info.py +44 -0
  650. tooluniverse/tools/get_poliastro_info.py +46 -0
  651. tooluniverse/tools/get_polymer_entity_annotations.py +49 -0
  652. tooluniverse/tools/get_polymer_entity_count_by_pdb_id.py +46 -0
  653. tooluniverse/tools/get_polymer_entity_ids_by_pdb_id.py +46 -0
  654. tooluniverse/tools/get_polymer_entity_type_by_entity_id.py +49 -0
  655. tooluniverse/tools/get_polymer_molecular_weight_by_entity_id.py +49 -0
  656. tooluniverse/tools/get_poretools_info.py +44 -0
  657. tooluniverse/tools/get_prody_info.py +46 -0
  658. tooluniverse/tools/get_protein_classification_by_pdb_id.py +49 -0
  659. tooluniverse/tools/get_protein_metadata_by_pdb_id.py +46 -0
  660. tooluniverse/tools/get_pubchempy_info.py +44 -0
  661. tooluniverse/tools/get_pybedtools_info.py +49 -0
  662. tooluniverse/tools/get_pybigwig_info.py +46 -0
  663. tooluniverse/tools/get_pydeseq2_info.py +46 -0
  664. tooluniverse/tools/get_pyensembl_info.py +44 -0
  665. tooluniverse/tools/get_pyephem_info.py +44 -0
  666. tooluniverse/tools/get_pyfaidx_info.py +49 -0
  667. tooluniverse/tools/get_pyfasta_info.py +44 -0
  668. tooluniverse/tools/get_pykalman_info.py +46 -0
  669. tooluniverse/tools/get_pyliftover_info.py +49 -0
  670. tooluniverse/tools/get_pymassspec_info.py +46 -0
  671. tooluniverse/tools/get_pymed_info.py +46 -0
  672. tooluniverse/tools/get_pymzml_info.py +46 -0
  673. tooluniverse/tools/get_pypdf2_info.py +46 -0
  674. tooluniverse/tools/get_pyranges_info.py +49 -0
  675. tooluniverse/tools/get_pyrosetta_info.py +44 -0
  676. tooluniverse/tools/get_pysam_info.py +46 -0
  677. tooluniverse/tools/get_pyscenic_info.py +46 -0
  678. tooluniverse/tools/get_pyscf_info.py +46 -0
  679. tooluniverse/tools/get_pyscreener_info.py +46 -0
  680. tooluniverse/tools/get_pytdc_info.py +46 -0
  681. tooluniverse/tools/get_python_libsbml_info.py +46 -0
  682. tooluniverse/tools/get_pytorch_info.py +49 -0
  683. tooluniverse/tools/get_pyvcf_info.py +44 -0
  684. tooluniverse/tools/get_pyvis_info.py +44 -0
  685. tooluniverse/tools/get_qutip_info.py +44 -0
  686. tooluniverse/tools/get_rasterio_info.py +44 -0
  687. tooluniverse/tools/get_rdkit_info.py +46 -0
  688. tooluniverse/tools/get_refinement_resolution_by_pdb_id.py +49 -0
  689. tooluniverse/tools/get_release_deposit_dates_by_pdb_id.py +49 -0
  690. tooluniverse/tools/get_reportlab_info.py +49 -0
  691. tooluniverse/tools/get_requests_info.py +49 -0
  692. tooluniverse/tools/get_ruptures_info.py +46 -0
  693. tooluniverse/tools/get_scanorama_info.py +44 -0
  694. tooluniverse/tools/get_scanpy_info.py +49 -0
  695. tooluniverse/tools/get_schnetpack_info.py +49 -0
  696. tooluniverse/tools/get_scholarly_info.py +46 -0
  697. tooluniverse/tools/get_scikit_bio_info.py +49 -0
  698. tooluniverse/tools/get_scikit_image_info.py +46 -0
  699. tooluniverse/tools/get_scikit_learn_info.py +49 -0
  700. tooluniverse/tools/get_scipy_info.py +46 -0
  701. tooluniverse/tools/get_scrublet_info.py +49 -0
  702. tooluniverse/tools/get_scvelo_info.py +49 -0
  703. tooluniverse/tools/get_scvi_tools_info.py +44 -0
  704. tooluniverse/tools/get_seaborn_info.py +49 -0
  705. tooluniverse/tools/get_sequence_by_pdb_id.py +46 -0
  706. tooluniverse/tools/get_sequence_lengths_by_pdb_id.py +46 -0
  707. tooluniverse/tools/get_sequence_positional_features_by_instance_id.py +49 -0
  708. tooluniverse/tools/get_skopt_info.py +44 -0
  709. tooluniverse/tools/get_souporcell_info.py +46 -0
  710. tooluniverse/tools/get_source_organism_by_pdb_id.py +46 -0
  711. tooluniverse/tools/get_space_group_by_pdb_id.py +46 -0
  712. tooluniverse/tools/get_statsmodels_info.py +49 -0
  713. tooluniverse/tools/get_structure_determination_software_by_pdb_id.py +49 -0
  714. tooluniverse/tools/get_structure_title_by_pdb_id.py +46 -0
  715. tooluniverse/tools/get_structure_validation_metrics_by_pdb_id.py +49 -0
  716. tooluniverse/tools/get_sunpy_info.py +44 -0
  717. tooluniverse/tools/get_sympy_info.py +46 -0
  718. tooluniverse/tools/get_target_cofactor_info.py +46 -0
  719. tooluniverse/tools/get_taxonomy_by_pdb_id.py +46 -0
  720. tooluniverse/tools/get_tiledb_info.py +46 -0
  721. tooluniverse/tools/get_tiledbsoma_info.py +46 -0
  722. tooluniverse/tools/get_torch_geometric_info.py +49 -0
  723. tooluniverse/tools/get_tqdm_info.py +46 -0
  724. tooluniverse/tools/get_trackpy_info.py +46 -0
  725. tooluniverse/tools/get_tskit_info.py +46 -0
  726. tooluniverse/tools/get_umap_learn_info.py +49 -0
  727. tooluniverse/tools/get_uniprot_accession_by_entity_id.py +49 -0
  728. tooluniverse/tools/get_velocyto_info.py +44 -0
  729. tooluniverse/tools/get_viennarna_info.py +49 -0
  730. tooluniverse/tools/get_webpage_text_from_url.py +52 -0
  731. tooluniverse/tools/get_webpage_title.py +49 -0
  732. tooluniverse/tools/get_xarray_info.py +44 -0
  733. tooluniverse/tools/get_xesmf_info.py +44 -0
  734. tooluniverse/tools/get_xgboost_info.py +44 -0
  735. tooluniverse/tools/get_zarr_info.py +44 -0
  736. tooluniverse/tools/gwas_get_association_by_id.py +49 -0
  737. tooluniverse/tools/gwas_get_associations_for_snp.py +67 -0
  738. tooluniverse/tools/gwas_get_associations_for_study.py +55 -0
  739. tooluniverse/tools/gwas_get_associations_for_trait.py +55 -0
  740. tooluniverse/tools/gwas_get_snp_by_id.py +46 -0
  741. tooluniverse/tools/gwas_get_snps_for_gene.py +55 -0
  742. tooluniverse/tools/gwas_get_studies_for_trait.py +75 -0
  743. tooluniverse/tools/gwas_get_study_by_id.py +46 -0
  744. tooluniverse/tools/gwas_get_variants_for_trait.py +55 -0
  745. tooluniverse/tools/gwas_search_associations.py +75 -0
  746. tooluniverse/tools/gwas_search_snps.py +63 -0
  747. tooluniverse/tools/gwas_search_studies.py +75 -0
  748. tooluniverse/tools/humanbase_ppi_analysis.py +67 -0
  749. tooluniverse/tools/mesh_get_subjects_by_pharmacological_action.py +63 -0
  750. tooluniverse/tools/mesh_get_subjects_by_subject_id.py +63 -0
  751. tooluniverse/tools/mesh_get_subjects_by_subject_name.py +63 -0
  752. tooluniverse/tools/mesh_get_subjects_by_subject_scope_or_definition.py +63 -0
  753. tooluniverse/tools/odphp_itemlist.py +49 -0
  754. tooluniverse/tools/odphp_myhealthfinder.py +67 -0
  755. tooluniverse/tools/odphp_outlink_fetch.py +59 -0
  756. tooluniverse/tools/odphp_topicsearch.py +67 -0
  757. tooluniverse/tools/openalex_literature_search.py +67 -0
  758. tooluniverse/tools/reactome_disease_target_score.py +52 -0
  759. tooluniverse/tools/search_clinical_trials.py +67 -0
  760. tooluniverse/tools/visualize_molecule_2d.py +83 -0
  761. tooluniverse/tools/visualize_molecule_3d.py +91 -0
  762. tooluniverse/tools/visualize_protein_structure_3d.py +79 -0
  763. tooluniverse/unified_guideline_tools.py +1210 -0
  764. tooluniverse/unpaywall_tool.py +62 -0
  765. tooluniverse/utils.py +71 -2
  766. tooluniverse/visualization_tool.py +897 -0
  767. tooluniverse/wikidata_sparql_tool.py +60 -0
  768. tooluniverse/zenodo_tool.py +72 -0
  769. {tooluniverse-1.0.5.dist-info → tooluniverse-1.0.7.dist-info}/METADATA +12 -2
  770. tooluniverse-1.0.7.dist-info/RECORD +855 -0
  771. {tooluniverse-1.0.5.dist-info → tooluniverse-1.0.7.dist-info}/entry_points.txt +4 -0
  772. tooluniverse/test/list_azure_openai_models.py +0 -210
  773. tooluniverse/test/mcp_server_test.py +0 -0
  774. tooluniverse/test/test_admetai_tool.py +0 -370
  775. tooluniverse/test/test_agentic_tool.py +0 -129
  776. tooluniverse/test/test_agentic_tool_azure_models.py +0 -91
  777. tooluniverse/test/test_alphafold_tool.py +0 -108
  778. tooluniverse/test/test_api_key_validation_min.py +0 -64
  779. tooluniverse/test/test_chem_tool.py +0 -37
  780. tooluniverse/test/test_claude_sdk.py +0 -86
  781. tooluniverse/test/test_compose_lieraturereview.py +0 -63
  782. tooluniverse/test/test_compose_tool.py +0 -448
  783. tooluniverse/test/test_dailymed.py +0 -69
  784. tooluniverse/test/test_dataset_tool.py +0 -200
  785. tooluniverse/test/test_disease_target_score.py +0 -56
  786. tooluniverse/test/test_drugbank_filter_examples.py +0 -179
  787. tooluniverse/test/test_efo.py +0 -31
  788. tooluniverse/test/test_enrichr_tool.py +0 -21
  789. tooluniverse/test/test_europe_pmc_tool.py +0 -20
  790. tooluniverse/test/test_fda_adv.py +0 -95
  791. tooluniverse/test/test_fda_drug_labeling.py +0 -91
  792. tooluniverse/test/test_gene_ontology_tools.py +0 -66
  793. tooluniverse/test/test_global_fallback.py +0 -288
  794. tooluniverse/test/test_gwas_tool.py +0 -139
  795. tooluniverse/test/test_hooks_direct.py +0 -219
  796. tooluniverse/test/test_hpa.py +0 -625
  797. tooluniverse/test/test_humanbase_tool.py +0 -20
  798. tooluniverse/test/test_idmap_tools.py +0 -61
  799. tooluniverse/test/test_list_built_in_tools.py +0 -33
  800. tooluniverse/test/test_mcp_server.py +0 -211
  801. tooluniverse/test/test_mcp_tool.py +0 -247
  802. tooluniverse/test/test_medlineplus.py +0 -220
  803. tooluniverse/test/test_odphp_tool.py +0 -166
  804. tooluniverse/test/test_openalex_tool.py +0 -32
  805. tooluniverse/test/test_openrouter_client.py +0 -288
  806. tooluniverse/test/test_opentargets.py +0 -28
  807. tooluniverse/test/test_pubchem_tool.py +0 -116
  808. tooluniverse/test/test_pubtator_tool.py +0 -37
  809. tooluniverse/test/test_rcsb_pdb_tool.py +0 -86
  810. tooluniverse/test/test_reactome.py +0 -54
  811. tooluniverse/test/test_semantic_scholar_tool.py +0 -24
  812. tooluniverse/test/test_software_tools.py +0 -147
  813. tooluniverse/test/test_stdio_hooks.py +0 -285
  814. tooluniverse/test/test_tool_description_optimizer.py +0 -49
  815. tooluniverse/test/test_tool_finder.py +0 -26
  816. tooluniverse/test/test_tool_finder_llm.py +0 -252
  817. tooluniverse/test/test_tools_find.py +0 -195
  818. tooluniverse/test/test_uniprot_tools.py +0 -74
  819. tooluniverse/test/test_uspto_tool.py +0 -72
  820. tooluniverse/test/test_xml_tool.py +0 -113
  821. tooluniverse-1.0.5.dist-info/RECORD +0 -198
  822. {tooluniverse-1.0.5.dist-info → tooluniverse-1.0.7.dist-info}/WHEEL +0 -0
  823. {tooluniverse-1.0.5.dist-info → tooluniverse-1.0.7.dist-info}/licenses/LICENSE +0 -0
  824. {tooluniverse-1.0.5.dist-info → tooluniverse-1.0.7.dist-info}/top_level.txt +0 -0
@@ -21,6 +21,29 @@ class BaseLLMClient:
21
21
  ) -> Optional[str]:
22
22
  raise NotImplementedError
23
23
 
24
+ def infer_stream(
25
+ self,
26
+ messages: List[Dict[str, str]],
27
+ temperature: Optional[float],
28
+ max_tokens: Optional[int],
29
+ return_json: bool,
30
+ custom_format: Any = None,
31
+ max_retries: int = 5,
32
+ retry_delay: int = 5,
33
+ ):
34
+ """Default streaming implementation falls back to regular inference."""
35
+ result = self.infer(
36
+ messages=messages,
37
+ temperature=temperature,
38
+ max_tokens=max_tokens,
39
+ return_json=return_json,
40
+ custom_format=custom_format,
41
+ max_retries=max_retries,
42
+ retry_delay=retry_delay,
43
+ )
44
+ if result is not None:
45
+ yield result
46
+
24
47
 
25
48
  class AzureOpenAIClient(BaseLLMClient):
26
49
  # Built-in defaults for model families (can be overridden by env)
@@ -305,6 +328,75 @@ class AzureOpenAIClient(BaseLLMClient):
305
328
  self.logger.error("Max retries exceeded. Unable to complete the request.")
306
329
  return None
307
330
 
331
+ def infer_stream(
332
+ self,
333
+ messages: List[Dict[str, str]],
334
+ temperature: Optional[float],
335
+ max_tokens: Optional[int],
336
+ return_json: bool,
337
+ custom_format: Any = None,
338
+ max_retries: int = 5,
339
+ retry_delay: int = 5,
340
+ ):
341
+ if return_json or custom_format is not None:
342
+ yield from super().infer_stream(
343
+ messages,
344
+ temperature,
345
+ max_tokens,
346
+ return_json,
347
+ custom_format,
348
+ max_retries,
349
+ retry_delay,
350
+ )
351
+ return
352
+
353
+ retries = 0
354
+ eff_temp = self._normalize_temperature(self.model_name, temperature)
355
+ eff_max = (
356
+ max_tokens
357
+ if max_tokens is not None
358
+ else self._resolve_default_max_tokens(self.model_name)
359
+ )
360
+
361
+ while retries < max_retries:
362
+ try:
363
+ kwargs: Dict[str, Any] = {
364
+ "model": self.model_name,
365
+ "messages": messages,
366
+ "stream": True,
367
+ }
368
+ if eff_temp is not None:
369
+ kwargs["temperature"] = eff_temp
370
+ if eff_max is not None:
371
+ kwargs["max_tokens"] = eff_max
372
+
373
+ stream = self.client.chat.completions.create(**kwargs)
374
+ for chunk in stream:
375
+ text = self._extract_text_from_chunk(chunk)
376
+ if text:
377
+ yield text
378
+ return
379
+ except self._openai.RateLimitError: # type: ignore[attr-defined]
380
+ self.logger.warning(
381
+ f"Rate limit exceeded. Retrying in {retry_delay} seconds (streaming)..."
382
+ )
383
+ retries += 1
384
+ time.sleep(retry_delay * retries)
385
+ except Exception as e: # noqa: BLE001
386
+ self.logger.error(f"Streaming error: {e}")
387
+ break
388
+
389
+ # Fallback to non-streaming if streaming fails
390
+ yield from super().infer_stream(
391
+ messages,
392
+ temperature,
393
+ max_tokens,
394
+ return_json,
395
+ custom_format,
396
+ max_retries,
397
+ retry_delay,
398
+ )
399
+
308
400
 
309
401
  class GeminiClient(BaseLLMClient):
310
402
  def __init__(self, model_name: str, logger):
@@ -368,6 +460,96 @@ class GeminiClient(BaseLLMClient):
368
460
  time.sleep(retry_delay * retries)
369
461
  return None
370
462
 
463
+ @staticmethod
464
+ def _extract_text_from_stream_chunk(chunk) -> Optional[str]:
465
+ if chunk is None:
466
+ return None
467
+ text = getattr(chunk, "text", None)
468
+ if text:
469
+ return text
470
+
471
+ candidates = getattr(chunk, "candidates", None)
472
+ if not candidates and isinstance(chunk, dict):
473
+ candidates = chunk.get("candidates")
474
+ if not candidates:
475
+ return None
476
+
477
+ candidate = candidates[0]
478
+ content = getattr(candidate, "content", None)
479
+ if content is None and isinstance(candidate, dict):
480
+ content = candidate.get("content")
481
+ if not content:
482
+ return None
483
+
484
+ parts = getattr(content, "parts", None)
485
+ if parts is None and isinstance(content, dict):
486
+ parts = content.get("parts")
487
+ if parts and isinstance(parts, list):
488
+ fragments: List[str] = []
489
+ for part in parts:
490
+ piece = getattr(part, "text", None)
491
+ if piece is None and isinstance(part, dict):
492
+ piece = part.get("text")
493
+ if piece:
494
+ fragments.append(piece)
495
+ return "".join(fragments) if fragments else None
496
+
497
+ final_text = getattr(content, "text", None)
498
+ if final_text is None and isinstance(content, dict):
499
+ final_text = content.get("text")
500
+ return final_text
501
+
502
+ def infer_stream(
503
+ self,
504
+ messages: List[Dict[str, str]],
505
+ temperature: Optional[float],
506
+ max_tokens: Optional[int],
507
+ return_json: bool,
508
+ custom_format: Any = None,
509
+ max_retries: int = 5,
510
+ retry_delay: int = 5,
511
+ ):
512
+ if return_json:
513
+ raise ValueError("Gemini JSON mode not supported here")
514
+
515
+ contents = ""
516
+ for m in messages:
517
+ if m["role"] in ("user", "system"):
518
+ contents += f"{m['content']}\n"
519
+
520
+ retries = 0
521
+ while retries < max_retries:
522
+ try:
523
+ gen_cfg: Dict[str, Any] = {
524
+ "temperature": (temperature if temperature is not None else 0)
525
+ }
526
+ if max_tokens is not None:
527
+ gen_cfg["max_output_tokens"] = max_tokens
528
+
529
+ model = self._build_model()
530
+ stream = model.generate_content(
531
+ contents, generation_config=gen_cfg, stream=True
532
+ )
533
+ for chunk in stream:
534
+ text = self._extract_text_from_stream_chunk(chunk)
535
+ if text:
536
+ yield text
537
+ return
538
+ except Exception as e: # noqa: BLE001
539
+ self.logger.error(f"Gemini streaming error: {e}")
540
+ retries += 1
541
+ time.sleep(retry_delay * retries)
542
+
543
+ yield from super().infer_stream(
544
+ messages,
545
+ temperature,
546
+ max_tokens,
547
+ return_json,
548
+ custom_format,
549
+ max_retries,
550
+ retry_delay,
551
+ )
552
+
371
553
 
372
554
  class OpenRouterClient(BaseLLMClient):
373
555
  """
@@ -377,11 +559,14 @@ class OpenRouterClient(BaseLLMClient):
377
559
 
378
560
  # Default model limits based on latest OpenRouter offerings
379
561
  DEFAULT_MODEL_LIMITS: Dict[str, Dict[str, int]] = {
380
- "openai/gpt-5": {"max_output": 128_000, "context_window": 400_000},
562
+ "openai/gpt-5": {"max_output": 128_000, "context_window": 400_000},
381
563
  "openai/gpt-5-codex": {"max_output": 128_000, "context_window": 400_000},
382
564
  "google/gemini-2.5-flash": {"max_output": 65_536, "context_window": 1_000_000},
383
565
  "google/gemini-2.5-pro": {"max_output": 65_536, "context_window": 1_000_000},
384
- "anthropic/claude-sonnet-4.5": {"max_output": 16_384, "context_window": 1_000_000},
566
+ "anthropic/claude-sonnet-4.5": {
567
+ "max_output": 16_384,
568
+ "context_window": 1_000_000,
569
+ },
385
570
  }
386
571
 
387
572
  def __init__(self, model_id: str, logger):
@@ -390,7 +575,7 @@ class OpenRouterClient(BaseLLMClient):
390
575
  import openai as _openai # type: ignore
391
576
  except Exception as e: # pragma: no cover
392
577
  raise RuntimeError("openai client is not available") from e
393
-
578
+
394
579
  self._OpenAI = _OpenAI
395
580
  self._openai = _openai
396
581
  self.model_name = model_id
@@ -399,14 +584,14 @@ class OpenRouterClient(BaseLLMClient):
399
584
  api_key = os.getenv("OPENROUTER_API_KEY")
400
585
  if not api_key:
401
586
  raise ValueError("OPENROUTER_API_KEY not set")
402
-
587
+
403
588
  # Optional headers for OpenRouter
404
589
  default_headers = {}
405
590
  if site_url := os.getenv("OPENROUTER_SITE_URL"):
406
591
  default_headers["HTTP-Referer"] = site_url
407
592
  if site_name := os.getenv("OPENROUTER_SITE_NAME"):
408
593
  default_headers["X-Title"] = site_name
409
-
594
+
410
595
  self.client = self._OpenAI(
411
596
  base_url="https://openrouter.ai/api/v1",
412
597
  api_key=api_key,
@@ -445,13 +630,13 @@ class OpenRouterClient(BaseLLMClient):
445
630
  mapping = _json.loads(mapping_raw)
446
631
  except Exception:
447
632
  mapping = {}
448
-
633
+
449
634
  if model_id in mapping:
450
635
  try:
451
636
  return int(mapping[model_id])
452
637
  except Exception:
453
638
  pass
454
-
639
+
455
640
  # Check for prefix match
456
641
  for k, v in mapping.items():
457
642
  try:
@@ -459,11 +644,11 @@ class OpenRouterClient(BaseLLMClient):
459
644
  return int(v)
460
645
  except Exception:
461
646
  continue
462
-
647
+
463
648
  # Next: built-in/default-limits map
464
649
  if model_id in self._default_limits:
465
650
  return int(self._default_limits[model_id].get("max_output", 0)) or None
466
-
651
+
467
652
  # Check for prefix match in default limits
468
653
  for k, v in self._default_limits.items():
469
654
  try:
@@ -471,7 +656,7 @@ class OpenRouterClient(BaseLLMClient):
471
656
  return int(v.get("max_output", 0)) or None
472
657
  except Exception:
473
658
  continue
474
-
659
+
475
660
  return None
476
661
 
477
662
  def test_api(self) -> None:
@@ -479,7 +664,7 @@ class OpenRouterClient(BaseLLMClient):
479
664
  test_messages = [{"role": "user", "content": "ping"}]
480
665
  token_attempts = [1, 4, 16, 32]
481
666
  last_error: Optional[Exception] = None
482
-
667
+
483
668
  for tok in token_attempts:
484
669
  try:
485
670
  self.client.chat.completions.create(
@@ -499,7 +684,7 @@ class OpenRouterClient(BaseLLMClient):
499
684
  ) and tok != token_attempts[-1]:
500
685
  continue
501
686
  break
502
-
687
+
503
688
  if last_error:
504
689
  raise ValueError(f"OpenRouter API test failed: {last_error}")
505
690
  raise ValueError("OpenRouter API test failed: unknown error")
@@ -521,39 +706,39 @@ class OpenRouterClient(BaseLLMClient):
521
706
  if custom_format is not None
522
707
  else self.client.chat.completions.create
523
708
  )
524
-
709
+
525
710
  response_format = (
526
711
  custom_format
527
712
  if custom_format is not None
528
713
  else ({"type": "json_object"} if return_json else None)
529
714
  )
530
-
715
+
531
716
  eff_max = (
532
717
  max_tokens
533
718
  if max_tokens is not None
534
719
  else self._resolve_default_max_tokens(self.model_name)
535
720
  )
536
-
721
+
537
722
  while retries < max_retries:
538
723
  try:
539
724
  kwargs: Dict[str, Any] = {
540
725
  "model": self.model_name,
541
726
  "messages": messages,
542
727
  }
543
-
728
+
544
729
  if response_format is not None:
545
730
  kwargs["response_format"] = response_format
546
731
  if temperature is not None:
547
732
  kwargs["temperature"] = temperature
548
733
  if eff_max is not None:
549
734
  kwargs["max_tokens"] = eff_max
550
-
735
+
551
736
  resp = call_fn(**kwargs)
552
-
737
+
553
738
  if custom_format is not None:
554
739
  return resp.choices[0].message.parsed.model_dump()
555
740
  return resp.choices[0].message.content
556
-
741
+
557
742
  except self._openai.RateLimitError: # type: ignore[attr-defined]
558
743
  self.logger.warning(
559
744
  f"Rate limit exceeded. Retrying in {retry_delay} seconds..."
@@ -563,8 +748,86 @@ class OpenRouterClient(BaseLLMClient):
563
748
  except Exception as e: # noqa: BLE001
564
749
  self.logger.error(f"OpenRouter error: {e}")
565
750
  import traceback
751
+
566
752
  traceback.print_exc()
567
753
  break
568
-
754
+
569
755
  self.logger.error("Max retries exceeded. Unable to complete the request.")
570
756
  return None
757
+
758
+
759
+ class VLLMClient(BaseLLMClient):
760
+ def __init__(self, model_name: str, server_url: str, logger):
761
+ try:
762
+ from openai import OpenAI
763
+ except Exception as e:
764
+ raise RuntimeError("openai package not available for vLLM client") from e
765
+
766
+ if not server_url:
767
+ raise ValueError("VLLM_SERVER_URL must be provided")
768
+
769
+ self.model_name = model_name
770
+ # Ensure server_url ends with /v1 for OpenAI-compatible API
771
+ if not server_url.endswith("/v1"):
772
+ server_url = server_url.rstrip("/") + "/v1"
773
+ self.server_url = server_url
774
+ self.logger = logger
775
+
776
+ self.client = OpenAI(
777
+ api_key="EMPTY",
778
+ base_url=self.server_url,
779
+ )
780
+
781
+ def test_api(self) -> None:
782
+ test_messages = [{"role": "user", "content": "ping"}]
783
+ try:
784
+ self.client.chat.completions.create(
785
+ model=self.model_name,
786
+ messages=test_messages,
787
+ max_tokens=8,
788
+ temperature=0,
789
+ )
790
+ except Exception as e:
791
+ raise ValueError(f"vLLM API test failed: {e}")
792
+
793
+ def infer(
794
+ self,
795
+ messages: List[Dict[str, str]],
796
+ temperature: Optional[float],
797
+ max_tokens: Optional[int],
798
+ return_json: bool,
799
+ custom_format: Any = None,
800
+ max_retries: int = 5,
801
+ retry_delay: int = 5,
802
+ ) -> Optional[str]:
803
+ if custom_format is not None:
804
+ self.logger.warning("vLLM does not support custom format, ignoring")
805
+
806
+ retries = 0
807
+ while retries < max_retries:
808
+ try:
809
+ kwargs: Dict[str, Any] = {
810
+ "model": self.model_name,
811
+ "messages": messages,
812
+ }
813
+
814
+ if temperature is not None:
815
+ kwargs["temperature"] = temperature
816
+
817
+ if max_tokens is not None:
818
+ kwargs["max_tokens"] = max_tokens
819
+
820
+ if return_json:
821
+ kwargs["response_format"] = {"type": "json_object"}
822
+
823
+ resp = self.client.chat.completions.create(**kwargs)
824
+ return resp.choices[0].message.content
825
+
826
+ except Exception as e:
827
+ self.logger.error(f"vLLM error: {e}")
828
+ retries += 1
829
+ if retries < max_retries:
830
+ time.sleep(retry_delay * retries)
831
+
832
+ self.logger.error("Max retries exceeded for vLLM request")
833
+ return None
@@ -348,7 +348,10 @@ def _start_server_for_port(port: int, **kwargs):
348
348
  try:
349
349
  # Enable stateless mode for MCPAutoLoaderTool compatibility
350
350
  server.run_simple(
351
- transport=config["transport"], host=config["host"], port=port, stateless_http=True
351
+ transport=config["transport"],
352
+ host=config["host"],
353
+ port=port,
354
+ stateless_http=True,
352
355
  )
353
356
  except Exception as e:
354
357
  print(f"❌ Error running MCP server on port {port}: {e}")
@@ -0,0 +1,116 @@
1
+ import requests
2
+ from .base_tool import BaseTool
3
+ from .tool_registry import register_tool
4
+
5
+
6
+ @register_tool("MedRxivTool")
7
+ class MedRxivTool(BaseTool):
8
+ """
9
+ Search medRxiv preprints using medRxiv's API (same interface as bioRxiv).
10
+
11
+ Arguments:
12
+ query (str): Search term
13
+ max_results (int): Max results to return (default 10, max 200)
14
+ """
15
+
16
+ def __init__(
17
+ self,
18
+ tool_config,
19
+ base_url="https://api.medrxiv.org/details",
20
+ ):
21
+ super().__init__(tool_config)
22
+ self.base_url = base_url
23
+
24
+ def run(self, arguments=None):
25
+ arguments = arguments or {}
26
+ query = arguments.get("query")
27
+ max_results = int(arguments.get("max_results", 10))
28
+ if not query:
29
+ return {"error": "`query` parameter is required."}
30
+ return self._search(query, max_results)
31
+
32
+ def _search(self, query, max_results):
33
+ # Use date range search for recent preprints
34
+ # Format: /medrxiv/{start_date}/{end_date}/{cursor}/json
35
+ from datetime import datetime, timedelta
36
+
37
+ # Search last 365 days to get more comprehensive results
38
+ end_date = datetime.now()
39
+ start_date = end_date - timedelta(days=365)
40
+
41
+ url = (
42
+ f"{self.base_url}/medrxiv/"
43
+ f"{start_date.strftime('%Y-%m-%d')}/"
44
+ f"{end_date.strftime('%Y-%m-%d')}/0/json"
45
+ )
46
+
47
+ try:
48
+ resp = requests.get(url, timeout=20)
49
+ resp.raise_for_status()
50
+ data = resp.json()
51
+ except requests.RequestException as e:
52
+ return {
53
+ "error": "Network/API error calling medRxiv",
54
+ "reason": str(e),
55
+ }
56
+ except ValueError:
57
+ return {"error": "Failed to decode medRxiv response as JSON"}
58
+
59
+ results = []
60
+ # The API returns a dictionary with a 'collection' key
61
+ collection = data.get("collection", [])
62
+ if not isinstance(collection, list):
63
+ return {"error": "Unexpected API response format"}
64
+
65
+ for item in collection:
66
+ title = item.get("title")
67
+ authors = item.get("authors", "")
68
+ if isinstance(authors, str):
69
+ authors = [a.strip() for a in authors.split(";") if a.strip()]
70
+ elif isinstance(authors, list):
71
+ authors = [str(a).strip() for a in authors if str(a).strip()]
72
+ else:
73
+ authors = []
74
+
75
+ year = None
76
+ date = item.get("date")
77
+ if date and len(date) >= 4 and date[:4].isdigit():
78
+ year = int(date[:4])
79
+
80
+ doi = item.get("doi")
81
+ url = f"https://www.medrxiv.org/content/{doi}" if doi else None
82
+
83
+ # Filter by query if provided - search in both title and abstract
84
+ if query:
85
+ title_match = query.lower() in (title or "").lower()
86
+ abstract_match = (
87
+ query.lower() in (item.get("abstract", "") or "").lower()
88
+ )
89
+ if not (title_match or abstract_match):
90
+ continue
91
+
92
+ results.append(
93
+ {
94
+ "title": title or "Title not available",
95
+ "authors": (
96
+ authors if authors else "Author information not available"
97
+ ),
98
+ "year": year,
99
+ "doi": doi or "DOI not available",
100
+ "url": url or "URL not available",
101
+ "abstract": item.get("abstract", "Abstract not available"),
102
+ "source": "medRxiv",
103
+ "data_quality": {
104
+ "has_abstract": bool(
105
+ item.get("abstract")
106
+ and item.get("abstract") != "Abstract not available"
107
+ ),
108
+ "has_authors": bool(authors),
109
+ "has_year": bool(year),
110
+ "has_doi": bool(doi),
111
+ "has_url": bool(url),
112
+ },
113
+ }
114
+ )
115
+
116
+ return results[:max_results]