aiagents4pharma 1.43.0__py3-none-any.whl → 1.45.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. aiagents4pharma/__init__.py +2 -2
  2. aiagents4pharma/talk2aiagents4pharma/.dockerignore +13 -0
  3. aiagents4pharma/talk2aiagents4pharma/Dockerfile +105 -0
  4. aiagents4pharma/talk2aiagents4pharma/README.md +1 -0
  5. aiagents4pharma/talk2aiagents4pharma/__init__.py +4 -5
  6. aiagents4pharma/talk2aiagents4pharma/agents/__init__.py +3 -2
  7. aiagents4pharma/talk2aiagents4pharma/agents/main_agent.py +24 -23
  8. aiagents4pharma/talk2aiagents4pharma/configs/__init__.py +2 -2
  9. aiagents4pharma/talk2aiagents4pharma/configs/agents/__init__.py +2 -2
  10. aiagents4pharma/talk2aiagents4pharma/configs/agents/main_agent/default.yaml +2 -2
  11. aiagents4pharma/talk2aiagents4pharma/configs/config.yaml +1 -1
  12. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/.env.example +23 -0
  13. aiagents4pharma/talk2aiagents4pharma/docker-compose/cpu/docker-compose.yml +93 -0
  14. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/.env.example +23 -0
  15. aiagents4pharma/talk2aiagents4pharma/docker-compose/gpu/docker-compose.yml +108 -0
  16. aiagents4pharma/talk2aiagents4pharma/install.md +127 -0
  17. aiagents4pharma/talk2aiagents4pharma/states/__init__.py +3 -2
  18. aiagents4pharma/talk2aiagents4pharma/states/state_talk2aiagents4pharma.py +5 -3
  19. aiagents4pharma/talk2aiagents4pharma/tests/__init__.py +2 -2
  20. aiagents4pharma/talk2aiagents4pharma/tests/test_main_agent.py +72 -50
  21. aiagents4pharma/talk2biomodels/.dockerignore +13 -0
  22. aiagents4pharma/talk2biomodels/Dockerfile +104 -0
  23. aiagents4pharma/talk2biomodels/README.md +1 -0
  24. aiagents4pharma/talk2biomodels/__init__.py +4 -8
  25. aiagents4pharma/talk2biomodels/agents/__init__.py +3 -2
  26. aiagents4pharma/talk2biomodels/agents/t2b_agent.py +47 -42
  27. aiagents4pharma/talk2biomodels/api/__init__.py +4 -5
  28. aiagents4pharma/talk2biomodels/api/kegg.py +14 -10
  29. aiagents4pharma/talk2biomodels/api/ols.py +13 -10
  30. aiagents4pharma/talk2biomodels/api/uniprot.py +7 -6
  31. aiagents4pharma/talk2biomodels/configs/__init__.py +3 -4
  32. aiagents4pharma/talk2biomodels/configs/agents/__init__.py +2 -2
  33. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/__init__.py +2 -2
  34. aiagents4pharma/talk2biomodels/configs/agents/t2b_agent/default.yaml +1 -1
  35. aiagents4pharma/talk2biomodels/configs/config.yaml +1 -1
  36. aiagents4pharma/talk2biomodels/configs/tools/__init__.py +4 -5
  37. aiagents4pharma/talk2biomodels/configs/tools/ask_question/__init__.py +2 -2
  38. aiagents4pharma/talk2biomodels/configs/tools/ask_question/default.yaml +1 -2
  39. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/__init__.py +2 -2
  40. aiagents4pharma/talk2biomodels/configs/tools/custom_plotter/default.yaml +1 -1
  41. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/__init__.py +2 -2
  42. aiagents4pharma/talk2biomodels/configs/tools/get_annotation/default.yaml +1 -1
  43. aiagents4pharma/talk2biomodels/install.md +63 -0
  44. aiagents4pharma/talk2biomodels/models/__init__.py +4 -4
  45. aiagents4pharma/talk2biomodels/models/basico_model.py +36 -28
  46. aiagents4pharma/talk2biomodels/models/sys_bio_model.py +13 -10
  47. aiagents4pharma/talk2biomodels/states/__init__.py +3 -2
  48. aiagents4pharma/talk2biomodels/states/state_talk2biomodels.py +12 -8
  49. aiagents4pharma/talk2biomodels/tests/BIOMD0000000449_url.xml +1585 -0
  50. aiagents4pharma/talk2biomodels/tests/__init__.py +2 -2
  51. aiagents4pharma/talk2biomodels/tests/article_on_model_537.pdf +0 -0
  52. aiagents4pharma/talk2biomodels/tests/test_api.py +18 -14
  53. aiagents4pharma/talk2biomodels/tests/test_ask_question.py +8 -9
  54. aiagents4pharma/talk2biomodels/tests/test_basico_model.py +15 -9
  55. aiagents4pharma/talk2biomodels/tests/test_get_annotation.py +54 -55
  56. aiagents4pharma/talk2biomodels/tests/test_getmodelinfo.py +28 -27
  57. aiagents4pharma/talk2biomodels/tests/test_integration.py +21 -33
  58. aiagents4pharma/talk2biomodels/tests/test_load_biomodel.py +14 -11
  59. aiagents4pharma/talk2biomodels/tests/test_param_scan.py +21 -20
  60. aiagents4pharma/talk2biomodels/tests/test_query_article.py +129 -29
  61. aiagents4pharma/talk2biomodels/tests/test_search_models.py +9 -13
  62. aiagents4pharma/talk2biomodels/tests/test_simulate_model.py +16 -15
  63. aiagents4pharma/talk2biomodels/tests/test_steady_state.py +12 -22
  64. aiagents4pharma/talk2biomodels/tests/test_sys_bio_model.py +33 -29
  65. aiagents4pharma/talk2biomodels/tools/__init__.py +15 -12
  66. aiagents4pharma/talk2biomodels/tools/ask_question.py +42 -32
  67. aiagents4pharma/talk2biomodels/tools/custom_plotter.py +51 -43
  68. aiagents4pharma/talk2biomodels/tools/get_annotation.py +99 -75
  69. aiagents4pharma/talk2biomodels/tools/get_modelinfo.py +57 -51
  70. aiagents4pharma/talk2biomodels/tools/load_arguments.py +52 -32
  71. aiagents4pharma/talk2biomodels/tools/load_biomodel.py +8 -2
  72. aiagents4pharma/talk2biomodels/tools/parameter_scan.py +107 -90
  73. aiagents4pharma/talk2biomodels/tools/query_article.py +14 -13
  74. aiagents4pharma/talk2biomodels/tools/search_models.py +37 -26
  75. aiagents4pharma/talk2biomodels/tools/simulate_model.py +47 -37
  76. aiagents4pharma/talk2biomodels/tools/steady_state.py +76 -58
  77. aiagents4pharma/talk2biomodels/tools/utils.py +4 -3
  78. aiagents4pharma/talk2cells/README.md +1 -0
  79. aiagents4pharma/talk2cells/__init__.py +4 -5
  80. aiagents4pharma/talk2cells/agents/__init__.py +3 -2
  81. aiagents4pharma/talk2cells/agents/scp_agent.py +21 -19
  82. aiagents4pharma/talk2cells/states/__init__.py +3 -2
  83. aiagents4pharma/talk2cells/states/state_talk2cells.py +4 -2
  84. aiagents4pharma/talk2cells/tests/scp_agent/test_scp_agent.py +8 -9
  85. aiagents4pharma/talk2cells/tools/__init__.py +3 -2
  86. aiagents4pharma/talk2cells/tools/scp_agent/__init__.py +4 -4
  87. aiagents4pharma/talk2cells/tools/scp_agent/display_studies.py +5 -3
  88. aiagents4pharma/talk2cells/tools/scp_agent/search_studies.py +21 -22
  89. aiagents4pharma/talk2knowledgegraphs/.dockerignore +13 -0
  90. aiagents4pharma/talk2knowledgegraphs/Dockerfile +103 -0
  91. aiagents4pharma/talk2knowledgegraphs/README.md +1 -0
  92. aiagents4pharma/talk2knowledgegraphs/__init__.py +4 -7
  93. aiagents4pharma/talk2knowledgegraphs/agents/__init__.py +3 -2
  94. aiagents4pharma/talk2knowledgegraphs/agents/t2kg_agent.py +40 -30
  95. aiagents4pharma/talk2knowledgegraphs/configs/__init__.py +3 -6
  96. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/__init__.py +2 -2
  97. aiagents4pharma/talk2knowledgegraphs/configs/agents/t2kg_agent/default.yaml +8 -8
  98. aiagents4pharma/talk2knowledgegraphs/configs/app/__init__.py +3 -2
  99. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/__init__.py +2 -2
  100. aiagents4pharma/talk2knowledgegraphs/configs/app/frontend/default.yaml +1 -1
  101. aiagents4pharma/talk2knowledgegraphs/configs/config.yaml +1 -1
  102. aiagents4pharma/talk2knowledgegraphs/configs/tools/__init__.py +4 -5
  103. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/__init__.py +2 -2
  104. aiagents4pharma/talk2knowledgegraphs/configs/tools/graphrag_reasoning/default.yaml +1 -1
  105. aiagents4pharma/talk2knowledgegraphs/configs/tools/multimodal_subgraph_extraction/default.yaml +17 -2
  106. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/__init__.py +2 -2
  107. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +1 -1
  108. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +2 -2
  109. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +1 -1
  110. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +1 -1
  111. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +1 -1
  112. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +1 -1
  113. aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +1 -1
  114. aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +4 -6
  115. aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +115 -67
  116. aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +2 -0
  117. aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +35 -24
  118. aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +29 -21
  119. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
  120. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
  121. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
  122. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
  123. aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +190 -0
  124. aiagents4pharma/talk2knowledgegraphs/install.md +140 -0
  125. aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +31 -65
  126. aiagents4pharma/talk2knowledgegraphs/states/__init__.py +3 -2
  127. aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +1 -0
  128. aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +65 -40
  129. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +54 -48
  130. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +4 -0
  131. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +17 -4
  132. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +33 -24
  133. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +116 -69
  134. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +736 -413
  135. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +22 -15
  136. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +19 -12
  137. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +95 -48
  138. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +4 -0
  139. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +5 -0
  140. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +13 -18
  141. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +10 -3
  142. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +4 -3
  143. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +3 -2
  144. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +1 -0
  145. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +9 -4
  146. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +6 -6
  147. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +4 -0
  148. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +442 -42
  149. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
  150. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +10 -6
  151. aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
  152. aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
  153. aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +245 -205
  154. aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +92 -90
  155. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +25 -37
  156. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +10 -13
  157. aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +4 -7
  158. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +4 -7
  159. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +4 -0
  160. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +11 -14
  161. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +7 -7
  162. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +12 -6
  163. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +8 -6
  164. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +9 -6
  165. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +1 -0
  166. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +15 -9
  167. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +23 -20
  168. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +12 -10
  169. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +16 -10
  170. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +26 -18
  171. aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +4 -5
  172. aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +218 -81
  173. aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +53 -47
  174. aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +18 -14
  175. aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +22 -23
  176. aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +11 -10
  177. aiagents4pharma/talk2scholars/.dockerignore +13 -0
  178. aiagents4pharma/talk2scholars/Dockerfile +104 -0
  179. aiagents4pharma/talk2scholars/README.md +1 -0
  180. aiagents4pharma/talk2scholars/agents/__init__.py +1 -5
  181. aiagents4pharma/talk2scholars/agents/main_agent.py +6 -4
  182. aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -4
  183. aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -2
  184. aiagents4pharma/talk2scholars/agents/s2_agent.py +2 -2
  185. aiagents4pharma/talk2scholars/agents/zotero_agent.py +10 -11
  186. aiagents4pharma/talk2scholars/configs/__init__.py +1 -3
  187. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +1 -4
  188. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +1 -1
  189. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +1 -1
  190. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +8 -8
  191. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +7 -7
  192. aiagents4pharma/talk2scholars/configs/tools/__init__.py +8 -6
  193. aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
  194. aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
  195. aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
  196. aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
  197. aiagents4pharma/talk2scholars/install.md +122 -0
  198. aiagents4pharma/talk2scholars/state/state_talk2scholars.py +8 -8
  199. aiagents4pharma/talk2scholars/tests/{test_main_agent.py → test_agents_main_agent.py} +41 -23
  200. aiagents4pharma/talk2scholars/tests/{test_paper_download_agent.py → test_agents_paper_agents_download_agent.py} +10 -16
  201. aiagents4pharma/talk2scholars/tests/{test_pdf_agent.py → test_agents_pdf_agent.py} +6 -10
  202. aiagents4pharma/talk2scholars/tests/{test_s2_agent.py → test_agents_s2_agent.py} +8 -16
  203. aiagents4pharma/talk2scholars/tests/{test_zotero_agent.py → test_agents_zotero_agent.py} +5 -7
  204. aiagents4pharma/talk2scholars/tests/{test_s2_display_dataframe.py → test_s2_tools_display_dataframe.py} +6 -7
  205. aiagents4pharma/talk2scholars/tests/{test_s2_query_dataframe.py → test_s2_tools_query_dataframe.py} +5 -15
  206. aiagents4pharma/talk2scholars/tests/{test_paper_downloader.py → test_tools_paper_downloader.py} +25 -63
  207. aiagents4pharma/talk2scholars/tests/{test_question_and_answer_tool.py → test_tools_question_and_answer_tool.py} +2 -6
  208. aiagents4pharma/talk2scholars/tests/{test_s2_multi.py → test_tools_s2_multi.py} +5 -5
  209. aiagents4pharma/talk2scholars/tests/{test_s2_retrieve.py → test_tools_s2_retrieve.py} +2 -1
  210. aiagents4pharma/talk2scholars/tests/{test_s2_search.py → test_tools_s2_search.py} +5 -5
  211. aiagents4pharma/talk2scholars/tests/{test_s2_single.py → test_tools_s2_single.py} +5 -5
  212. aiagents4pharma/talk2scholars/tests/{test_arxiv_downloader.py → test_utils_arxiv_downloader.py} +16 -25
  213. aiagents4pharma/talk2scholars/tests/{test_base_paper_downloader.py → test_utils_base_paper_downloader.py} +25 -47
  214. aiagents4pharma/talk2scholars/tests/{test_biorxiv_downloader.py → test_utils_biorxiv_downloader.py} +14 -42
  215. aiagents4pharma/talk2scholars/tests/{test_medrxiv_downloader.py → test_utils_medrxiv_downloader.py} +15 -49
  216. aiagents4pharma/talk2scholars/tests/{test_nvidia_nim_reranker.py → test_utils_nvidia_nim_reranker.py} +6 -16
  217. aiagents4pharma/talk2scholars/tests/{test_pdf_answer_formatter.py → test_utils_pdf_answer_formatter.py} +1 -0
  218. aiagents4pharma/talk2scholars/tests/{test_pdf_batch_processor.py → test_utils_pdf_batch_processor.py} +6 -15
  219. aiagents4pharma/talk2scholars/tests/{test_pdf_collection_manager.py → test_utils_pdf_collection_manager.py} +34 -11
  220. aiagents4pharma/talk2scholars/tests/{test_pdf_document_processor.py → test_utils_pdf_document_processor.py} +2 -3
  221. aiagents4pharma/talk2scholars/tests/{test_pdf_generate_answer.py → test_utils_pdf_generate_answer.py} +3 -6
  222. aiagents4pharma/talk2scholars/tests/{test_pdf_gpu_detection.py → test_utils_pdf_gpu_detection.py} +5 -16
  223. aiagents4pharma/talk2scholars/tests/{test_pdf_rag_pipeline.py → test_utils_pdf_rag_pipeline.py} +7 -17
  224. aiagents4pharma/talk2scholars/tests/{test_pdf_retrieve_chunks.py → test_utils_pdf_retrieve_chunks.py} +4 -11
  225. aiagents4pharma/talk2scholars/tests/{test_pdf_singleton_manager.py → test_utils_pdf_singleton_manager.py} +26 -23
  226. aiagents4pharma/talk2scholars/tests/{test_pdf_vector_normalization.py → test_utils_pdf_vector_normalization.py} +1 -1
  227. aiagents4pharma/talk2scholars/tests/{test_pdf_vector_store.py → test_utils_pdf_vector_store.py} +27 -55
  228. aiagents4pharma/talk2scholars/tests/{test_pubmed_downloader.py → test_utils_pubmed_downloader.py} +31 -91
  229. aiagents4pharma/talk2scholars/tests/{test_read_helper_utils.py → test_utils_read_helper_utils.py} +2 -6
  230. aiagents4pharma/talk2scholars/tests/{test_s2_utils_ext_ids.py → test_utils_s2_utils_ext_ids.py} +5 -15
  231. aiagents4pharma/talk2scholars/tests/{test_zotero_human_in_the_loop.py → test_utils_zotero_human_in_the_loop.py} +6 -13
  232. aiagents4pharma/talk2scholars/tests/{test_zotero_path.py → test_utils_zotero_path.py} +53 -45
  233. aiagents4pharma/talk2scholars/tests/{test_zotero_read.py → test_utils_zotero_read.py} +30 -91
  234. aiagents4pharma/talk2scholars/tests/{test_zotero_write.py → test_utils_zotero_write.py} +6 -16
  235. aiagents4pharma/talk2scholars/tools/__init__.py +1 -4
  236. aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +20 -35
  237. aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +7 -5
  238. aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +9 -11
  239. aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +14 -21
  240. aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +14 -22
  241. aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +11 -13
  242. aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +14 -28
  243. aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +4 -8
  244. aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +16 -14
  245. aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +4 -4
  246. aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +15 -17
  247. aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +2 -2
  248. aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +5 -5
  249. aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +4 -4
  250. aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +2 -6
  251. aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +5 -9
  252. aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +4 -4
  253. aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +2 -2
  254. aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +6 -15
  255. aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +7 -15
  256. aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +2 -2
  257. aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +3 -4
  258. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +8 -17
  259. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +17 -33
  260. aiagents4pharma/talk2scholars/tools/s2/__init__.py +8 -6
  261. aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +3 -7
  262. aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +7 -6
  263. aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +5 -12
  264. aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +2 -4
  265. aiagents4pharma/talk2scholars/tools/s2/search.py +6 -6
  266. aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +5 -3
  267. aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +1 -3
  268. aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +12 -18
  269. aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +11 -18
  270. aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +11 -16
  271. aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -4
  272. aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +1 -4
  273. aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +21 -39
  274. aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +2 -6
  275. aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +8 -11
  276. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +4 -12
  277. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +13 -27
  278. aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +4 -7
  279. aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +8 -10
  280. aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +3 -2
  281. {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/METADATA +115 -50
  282. aiagents4pharma-1.45.0.dist-info/RECORD +324 -0
  283. {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/WHEEL +1 -2
  284. aiagents4pharma-1.43.0.dist-info/RECORD +0 -293
  285. aiagents4pharma-1.43.0.dist-info/top_level.txt +0 -1
  286. /aiagents4pharma/talk2scholars/tests/{test_state.py → test_states_state.py} +0 -0
  287. /aiagents4pharma/talk2scholars/tests/{test_pdf_paper_loader.py → test_utils_pdf_paper_loader.py} +0 -0
  288. /aiagents4pharma/talk2scholars/tests/{test_tool_helper_utils.py → test_utils_tool_helper_utils.py} +0 -0
  289. /aiagents4pharma/talk2scholars/tests/{test_zotero_pdf_downloader_utils.py → test_utils_zotero_pdf_downloader_utils.py} +0 -0
  290. {aiagents4pharma-1.43.0.dist-info → aiagents4pharma-1.45.0.dist-info}/licenses/LICENSE +0 -0
@@ -5,31 +5,38 @@ Tool for asking a question about the simulation results.
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Type, Annotated, Literal
9
- import hydra
8
+ from typing import Annotated, Literal
9
+
10
10
  import basico
11
+ import hydra
11
12
  import pandas as pd
12
- from pydantic import BaseModel, Field
13
13
  from langchain_core.tools.base import BaseTool
14
14
  from langchain_experimental.agents import create_pandas_dataframe_agent
15
15
  from langgraph.prebuilt import InjectedState
16
+ from pydantic import BaseModel, Field
16
17
 
17
18
  # Initialize logger
18
19
  logging.basicConfig(level=logging.INFO)
19
20
  logger = logging.getLogger(__name__)
20
21
 
22
+
21
23
  class AskQuestionInput(BaseModel):
22
24
  """
23
25
  Input schema for the AskQuestion tool.
24
26
  """
27
+
25
28
  question: str = Field(description="question about the simulation and steady state results")
26
- experiment_name: str = Field(description="""Name assigned to the simulation
27
- or steady state analysis when the tool
28
- simulate_model or steady_state is invoked.""")
29
+ experiment_name: str = Field(
30
+ description="""Name assigned to the simulation
31
+ or steady state analysis when the tool
32
+ simulate_model or steady_state is invoked."""
33
+ )
29
34
  question_context: Literal["simulation", "steady_state"] = Field(
30
- description="Context of the question")
35
+ description="Context of the question"
36
+ )
31
37
  state: Annotated[dict, InjectedState]
32
38
 
39
+
33
40
  # Note: It's important that every field has type hints.
34
41
  # BaseTool is a Pydantic class and not having type hints
35
42
  # can lead to unexpected behavior.
@@ -37,17 +44,20 @@ class AskQuestionTool(BaseTool):
37
44
  """
38
45
  Tool for asking a question about the simulation or steady state results.
39
46
  """
47
+
40
48
  name: str = "ask_question"
41
49
  description: str = """A tool to ask question about the
42
50
  simulation or steady state results."""
43
- args_schema: Type[BaseModel] = AskQuestionInput
51
+ args_schema: type[BaseModel] = AskQuestionInput
44
52
  return_direct: bool = False
45
53
 
46
- def _run(self,
47
- question: str,
48
- experiment_name: str,
49
- question_context: Literal["simulation", "steady_state"],
50
- state: Annotated[dict, InjectedState]) -> str:
54
+ def _run(
55
+ self,
56
+ question: str,
57
+ experiment_name: str,
58
+ question_context: Literal["simulation", "steady_state"],
59
+ state: Annotated[dict, InjectedState],
60
+ ) -> str:
51
61
  """
52
62
  Run the tool.
53
63
 
@@ -59,15 +69,16 @@ class AskQuestionTool(BaseTool):
59
69
  Returns:
60
70
  str: The answer to the question.
61
71
  """
62
- logger.log(logging.INFO,
63
- "Calling ask_question tool %s, %s, %s",
64
- question,
65
- question_context,
66
- experiment_name)
72
+ logger.log(
73
+ logging.INFO,
74
+ "Calling ask_question tool %s, %s, %s",
75
+ question,
76
+ question_context,
77
+ experiment_name,
78
+ )
67
79
  # Load hydra configuration
68
80
  with hydra.initialize(version_base=None, config_path="../configs"):
69
- cfg = hydra.compose(config_name='config',
70
- overrides=['tools/ask_question=default'])
81
+ cfg = hydra.compose(config_name="config", overrides=["tools/ask_question=default"])
71
82
  cfg = cfg.tools.ask_question
72
83
  # Get the context of the question
73
84
  # and based on the context, get the data
@@ -89,9 +100,7 @@ class AskQuestionTool(BaseTool):
89
100
  df_data = pd.DataFrame.from_dict(dic_data)
90
101
  # Extract the data for the experiment
91
102
  # matching the experiment name
92
- df = pd.DataFrame(
93
- df_data[df_data['name'] == experiment_name]['data'].iloc[0]
94
- )
103
+ df = pd.DataFrame(df_data[df_data["name"] == experiment_name]["data"].iloc[0])
95
104
  logger.log(logging.INFO, "Shape of the dataframe: %s", df.shape)
96
105
  # # Extract the model units
97
106
  # model_units = basico.model_info.get_model_units()
@@ -100,15 +109,16 @@ class AskQuestionTool(BaseTool):
100
109
  prompt_content += f"{basico.model_info.get_model_units()}\n\n"
101
110
  # Create a pandas dataframe agent
102
111
  df_agent = create_pandas_dataframe_agent(
103
- state['llm_model'],
104
- allow_dangerous_code=True,
105
- agent_type='tool-calling',
106
- df=df,
107
- max_iterations=5,
108
- include_df_in_prompt=True,
109
- number_of_head_rows=df.shape[0],
110
- verbose=True,
111
- prefix=prompt_content)
112
+ state["llm_model"],
113
+ allow_dangerous_code=True,
114
+ agent_type="tool-calling",
115
+ df=df,
116
+ max_iterations=5,
117
+ include_df_in_prompt=True,
118
+ number_of_head_rows=df.shape[0],
119
+ verbose=True,
120
+ prefix=prompt_content,
121
+ )
112
122
  # Invoke the agent with the question
113
123
  llm_result = df_agent.invoke(question, stream_mode=None)
114
124
  # print (llm_result)
@@ -5,13 +5,15 @@ Tool for plotting a custom y-axis of a simulation plot.
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Type, Annotated, List, Tuple, Union, Literal
9
- from pydantic import BaseModel, Field
8
+ from typing import Annotated, Literal
9
+
10
10
  import hydra
11
11
  import pandas as pd
12
- from langchain_core.tools import BaseTool
13
12
  from langchain_core.prompts import ChatPromptTemplate
13
+ from langchain_core.tools import BaseTool
14
14
  from langgraph.prebuilt import InjectedState
15
+ from pydantic import BaseModel, Field
16
+
15
17
  from .load_biomodel import ModelData, load_biomodel
16
18
  from .utils import get_model_units
17
19
 
@@ -19,6 +21,7 @@ from .utils import get_model_units
19
21
  logging.basicConfig(level=logging.INFO)
20
22
  logger = logging.getLogger(__name__)
21
23
 
24
+
22
25
  def extract_relevant_species(question, species_names, state):
23
26
  """
24
27
  Extract the relevant species from the user question.
@@ -31,6 +34,7 @@ def extract_relevant_species(question, species_names, state):
31
34
  Returns:
32
35
  CustomHeader: The relevant species
33
36
  """
37
+
34
38
  # In the following code, we extract the species
35
39
  # from the user question. We use Literal to restrict
36
40
  # the species names to the ones available in the
@@ -41,44 +45,46 @@ def extract_relevant_species(question, species_names, state):
41
45
 
42
46
  This is a Pydantic model that restricts the species
43
47
  names to the ones available in the simulation results.
44
-
48
+
45
49
  If no species is relevant, set the attribute
46
50
  `relevant_species` to None.
47
51
  """
48
- relevant_species: Union[None, List[Literal[*species_names]]] = Field(
49
- description="This is a list of species based on the user question."
50
- "It is restricted to the species available in the simulation results."
51
- "If no species is relevant, set this attribute to None."
52
- "If the user asks for very specific species (for example, using the"
53
- "keyword `only` in the question), set this attribute to correspond "
54
- "to the species available in the simulation results, otherwise set it to None."
55
- )
52
+
53
+ relevant_species: None | list[Literal[*species_names,]] = Field(
54
+ description="This is a list of species based on the user question."
55
+ "It is restricted to the species available in the simulation results."
56
+ "If no species is relevant, set this attribute to None."
57
+ "If the user asks for very specific species (for example, using the"
58
+ "keyword `only` in the question), set this attribute to correspond "
59
+ "to the species available in the simulation results, otherwise set it to None."
60
+ )
61
+
56
62
  # Load hydra configuration
57
63
  with hydra.initialize(version_base=None, config_path="../configs"):
58
- cfg = hydra.compose(config_name='config',
59
- overrides=['tools/custom_plotter=default'])
64
+ cfg = hydra.compose(config_name="config", overrides=["tools/custom_plotter=default"])
60
65
  cfg = cfg.tools.custom_plotter
61
66
  # Get the system prompt
62
67
  system_prompt = cfg.system_prompt_custom_header
63
68
  # Create an instance of the LLM model
64
- logging.log(logging.INFO, "LLM model: %s", state['llm_model'])
65
- llm = state['llm_model']
69
+ logging.log(logging.INFO, "LLM model: %s", state["llm_model"])
70
+ llm = state["llm_model"]
66
71
  llm_with_structured_output = llm.with_structured_output(CustomHeader)
67
- prompt = ChatPromptTemplate.from_messages([("system", system_prompt),
68
- ("human", "{input}")])
72
+ prompt = ChatPromptTemplate.from_messages([("system", system_prompt), ("human", "{input}")])
69
73
  few_shot_structured_llm = prompt | llm_with_structured_output
70
74
  return few_shot_structured_llm.invoke(question)
71
75
 
76
+
72
77
  class CustomPlotterInput(BaseModel):
73
78
  """
74
79
  Input schema for the custom plotter tool.
75
80
  """
81
+
76
82
  question: str = Field(description="Description of the plot")
77
- sys_bio_model: ModelData = Field(description="model data",
78
- default=None)
83
+ sys_bio_model: ModelData = Field(description="model data", default=None)
79
84
  simulation_name: str = Field(description="Name assigned to the simulation")
80
85
  state: Annotated[dict, InjectedState]
81
86
 
87
+
82
88
  # Note: It's important that every field has type hints.
83
89
  # BaseTool is a Pydantic class and not having type hints
84
90
  # can lead to unexpected behavior.
@@ -89,21 +95,23 @@ class CustomPlotterTool(BaseTool):
89
95
  """
90
96
  Tool for custom plotting the y-axis of a plot.
91
97
  """
98
+
92
99
  name: str = "custom_plotter"
93
- description: str = '''A visualization tool designed to extract and display a subset
100
+ description: str = """A visualization tool designed to extract and display a subset
94
101
  of the larger simulation plot generated by the simulate_model tool.
95
- It allows users to specify particular species for the y-axis,
96
- providing a more targeted view of key species without the clutter
97
- of the full plot.'''
98
- args_schema: Type[BaseModel] = CustomPlotterInput
102
+ It allows users to specify particular species for the y-axis,
103
+ providing a more targeted view of key species without the clutter
104
+ of the full plot."""
105
+ args_schema: type[BaseModel] = CustomPlotterInput
99
106
  response_format: str = "content_and_artifact"
100
107
 
101
- def _run(self,
102
- question: str,
103
- sys_bio_model: ModelData,
104
- simulation_name: str,
105
- state: Annotated[dict, InjectedState]
106
- ) -> Tuple[str, Union[None, List[str]]]:
108
+ def _run(
109
+ self,
110
+ question: str,
111
+ sys_bio_model: ModelData,
112
+ simulation_name: str,
113
+ state: Annotated[dict, InjectedState],
114
+ ) -> tuple[str, None | list[str]]:
107
115
  """
108
116
  Run the tool.
109
117
 
@@ -118,7 +126,7 @@ class CustomPlotterTool(BaseTool):
118
126
  """
119
127
  logger.log(logging.INFO, "Calling custom_plotter tool %s, %s", question, sys_bio_model)
120
128
  # Load the model
121
- sbml_file_path = state['sbml_file_path'][-1] if len(state['sbml_file_path']) > 0 else None
129
+ sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
122
130
  model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
123
131
  dic_simulated_data = {}
124
132
  for data in state["dic_simulated_data"]:
@@ -129,20 +137,20 @@ class CustomPlotterTool(BaseTool):
129
137
  # Create a pandas dataframe from the dictionary
130
138
  df = pd.DataFrame.from_dict(dic_simulated_data)
131
139
  # Get the simulated data for the current tool call
132
- df = pd.DataFrame(
133
- df[df['name'] == simulation_name]['data'].iloc[0]
134
- )
140
+ df = pd.DataFrame(df[df["name"] == simulation_name]["data"].iloc[0])
135
141
  # df = pd.DataFrame.from_dict(state['dic_simulated_data'])
136
142
  species_names = df.columns.tolist()
137
143
  # Exclude the time column
138
- species_names.remove('Time')
144
+ species_names.remove("Time")
139
145
  logging.log(logging.INFO, "Species names: %s", species_names)
140
146
  # Extract the relevant species from the user question
141
147
  results = extract_relevant_species(question, species_names, state)
142
- print (results)
148
+ print(results)
143
149
  if results.relevant_species is None:
144
- raise ValueError("No species found in the simulation results \
145
- that matches the user prompt.")
150
+ raise ValueError(
151
+ "No species found in the simulation results \
152
+ that matches the user prompt."
153
+ )
146
154
  extracted_species = []
147
155
  # Extract the species from the results
148
156
  # that are available in the simulation results
@@ -151,7 +159,7 @@ class CustomPlotterTool(BaseTool):
151
159
  extracted_species.append(species)
152
160
  logging.info("Extracted species: %s", extracted_species)
153
161
  # Include the time column
154
- extracted_species.insert(0, 'Time')
155
- return f"Custom plot {simulation_name}",{
156
- 'dic_data': df[extracted_species].to_dict(orient='records')
157
- }| get_model_units(model_object)
162
+ extracted_species.insert(0, "Time")
163
+ return f"Custom plot {simulation_name}", {
164
+ "dic_data": df[extracted_species].to_dict(orient="records")
165
+ } | get_model_units(model_object)