aiagents4pharma 1.44.0__py3-none-any.whl → 1.45.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) 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/subgraph_extraction/__init__.py +2 -2
  106. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_extraction/default.yaml +1 -1
  107. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/__init__.py +2 -2
  108. aiagents4pharma/talk2knowledgegraphs/configs/tools/subgraph_summarization/default.yaml +1 -1
  109. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/ols_terms/default.yaml +1 -1
  110. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/reactome_pathways/default.yaml +1 -1
  111. aiagents4pharma/talk2knowledgegraphs/configs/utils/enrichments/uniprot_proteins/default.yaml +1 -1
  112. aiagents4pharma/talk2knowledgegraphs/configs/utils/pubchem_utils/default.yaml +1 -1
  113. aiagents4pharma/talk2knowledgegraphs/datasets/__init__.py +4 -6
  114. aiagents4pharma/talk2knowledgegraphs/datasets/biobridge_primekg.py +115 -67
  115. aiagents4pharma/talk2knowledgegraphs/datasets/dataset.py +2 -0
  116. aiagents4pharma/talk2knowledgegraphs/datasets/primekg.py +35 -24
  117. aiagents4pharma/talk2knowledgegraphs/datasets/starkqa_primekg.py +29 -21
  118. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/.env.example +23 -0
  119. aiagents4pharma/talk2knowledgegraphs/docker-compose/cpu/docker-compose.yml +93 -0
  120. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/.env.example +23 -0
  121. aiagents4pharma/talk2knowledgegraphs/docker-compose/gpu/docker-compose.yml +108 -0
  122. aiagents4pharma/talk2knowledgegraphs/entrypoint.sh +190 -0
  123. aiagents4pharma/talk2knowledgegraphs/install.md +140 -0
  124. aiagents4pharma/talk2knowledgegraphs/milvus_data_dump.py +31 -65
  125. aiagents4pharma/talk2knowledgegraphs/states/__init__.py +3 -2
  126. aiagents4pharma/talk2knowledgegraphs/states/state_talk2knowledgegraphs.py +1 -0
  127. aiagents4pharma/talk2knowledgegraphs/tests/test_agents_t2kg_agent.py +65 -40
  128. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_biobridge_primekg.py +54 -48
  129. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_dataset.py +4 -0
  130. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_primekg.py +17 -4
  131. aiagents4pharma/talk2knowledgegraphs/tests/test_datasets_starkqa_primekg.py +33 -24
  132. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_graphrag_reasoning.py +116 -69
  133. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_milvus_multimodal_subgraph_extraction.py +334 -216
  134. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_multimodal_subgraph_extraction.py +22 -15
  135. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_extraction.py +19 -12
  136. aiagents4pharma/talk2knowledgegraphs/tests/test_tools_subgraph_summarization.py +95 -48
  137. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_embeddings.py +4 -0
  138. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_huggingface.py +5 -0
  139. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_nim_molmim.py +13 -18
  140. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_embeddings_ollama.py +10 -3
  141. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_enrichments.py +4 -3
  142. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ollama.py +3 -2
  143. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_ols.py +1 -0
  144. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_pubchem.py +9 -4
  145. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_reactome.py +6 -6
  146. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_enrichments_uniprot.py +4 -0
  147. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_extractions_milvus_multimodal_pcst.py +160 -97
  148. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_kg_utils.py +3 -4
  149. aiagents4pharma/talk2knowledgegraphs/tests/test_utils_pubchem_utils.py +87 -13
  150. aiagents4pharma/talk2knowledgegraphs/tools/__init__.py +10 -7
  151. aiagents4pharma/talk2knowledgegraphs/tools/graphrag_reasoning.py +15 -20
  152. aiagents4pharma/talk2knowledgegraphs/tools/milvus_multimodal_subgraph_extraction.py +145 -142
  153. aiagents4pharma/talk2knowledgegraphs/tools/multimodal_subgraph_extraction.py +92 -90
  154. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_extraction.py +25 -37
  155. aiagents4pharma/talk2knowledgegraphs/tools/subgraph_summarization.py +10 -13
  156. aiagents4pharma/talk2knowledgegraphs/utils/__init__.py +4 -7
  157. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/__init__.py +4 -7
  158. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/embeddings.py +4 -0
  159. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/huggingface.py +11 -14
  160. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/nim_molmim.py +7 -7
  161. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/ollama.py +12 -6
  162. aiagents4pharma/talk2knowledgegraphs/utils/embeddings/sentence_transformer.py +8 -6
  163. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/__init__.py +9 -6
  164. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/enrichments.py +1 -0
  165. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ollama.py +15 -9
  166. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/ols_terms.py +23 -20
  167. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/pubchem_strings.py +12 -10
  168. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/reactome_pathways.py +16 -10
  169. aiagents4pharma/talk2knowledgegraphs/utils/enrichments/uniprot_proteins.py +26 -18
  170. aiagents4pharma/talk2knowledgegraphs/utils/extractions/__init__.py +4 -5
  171. aiagents4pharma/talk2knowledgegraphs/utils/extractions/milvus_multimodal_pcst.py +14 -34
  172. aiagents4pharma/talk2knowledgegraphs/utils/extractions/multimodal_pcst.py +53 -47
  173. aiagents4pharma/talk2knowledgegraphs/utils/extractions/pcst.py +18 -14
  174. aiagents4pharma/talk2knowledgegraphs/utils/kg_utils.py +22 -23
  175. aiagents4pharma/talk2knowledgegraphs/utils/pubchem_utils.py +11 -10
  176. aiagents4pharma/talk2scholars/.dockerignore +13 -0
  177. aiagents4pharma/talk2scholars/Dockerfile +104 -0
  178. aiagents4pharma/talk2scholars/README.md +1 -0
  179. aiagents4pharma/talk2scholars/agents/__init__.py +1 -5
  180. aiagents4pharma/talk2scholars/agents/main_agent.py +6 -4
  181. aiagents4pharma/talk2scholars/agents/paper_download_agent.py +5 -4
  182. aiagents4pharma/talk2scholars/agents/pdf_agent.py +4 -2
  183. aiagents4pharma/talk2scholars/agents/s2_agent.py +2 -2
  184. aiagents4pharma/talk2scholars/agents/zotero_agent.py +10 -11
  185. aiagents4pharma/talk2scholars/configs/__init__.py +1 -3
  186. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/__init__.py +1 -4
  187. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/main_agent/default.yaml +1 -1
  188. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/pdf_agent/default.yaml +1 -1
  189. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/s2_agent/default.yaml +8 -8
  190. aiagents4pharma/talk2scholars/configs/agents/talk2scholars/zotero_agent/default.yaml +7 -7
  191. aiagents4pharma/talk2scholars/configs/tools/__init__.py +8 -6
  192. aiagents4pharma/talk2scholars/docker-compose/cpu/.env.example +21 -0
  193. aiagents4pharma/talk2scholars/docker-compose/cpu/docker-compose.yml +90 -0
  194. aiagents4pharma/talk2scholars/docker-compose/gpu/.env.example +21 -0
  195. aiagents4pharma/talk2scholars/docker-compose/gpu/docker-compose.yml +105 -0
  196. aiagents4pharma/talk2scholars/install.md +122 -0
  197. aiagents4pharma/talk2scholars/state/state_talk2scholars.py +8 -8
  198. aiagents4pharma/talk2scholars/tests/{test_main_agent.py → test_agents_main_agent.py} +41 -23
  199. aiagents4pharma/talk2scholars/tests/{test_paper_download_agent.py → test_agents_paper_agents_download_agent.py} +10 -16
  200. aiagents4pharma/talk2scholars/tests/{test_pdf_agent.py → test_agents_pdf_agent.py} +6 -10
  201. aiagents4pharma/talk2scholars/tests/{test_s2_agent.py → test_agents_s2_agent.py} +8 -16
  202. aiagents4pharma/talk2scholars/tests/{test_zotero_agent.py → test_agents_zotero_agent.py} +5 -7
  203. aiagents4pharma/talk2scholars/tests/{test_s2_display_dataframe.py → test_s2_tools_display_dataframe.py} +6 -7
  204. aiagents4pharma/talk2scholars/tests/{test_s2_query_dataframe.py → test_s2_tools_query_dataframe.py} +5 -15
  205. aiagents4pharma/talk2scholars/tests/{test_paper_downloader.py → test_tools_paper_downloader.py} +25 -63
  206. aiagents4pharma/talk2scholars/tests/{test_question_and_answer_tool.py → test_tools_question_and_answer_tool.py} +2 -6
  207. aiagents4pharma/talk2scholars/tests/{test_s2_multi.py → test_tools_s2_multi.py} +5 -5
  208. aiagents4pharma/talk2scholars/tests/{test_s2_retrieve.py → test_tools_s2_retrieve.py} +2 -1
  209. aiagents4pharma/talk2scholars/tests/{test_s2_search.py → test_tools_s2_search.py} +5 -5
  210. aiagents4pharma/talk2scholars/tests/{test_s2_single.py → test_tools_s2_single.py} +5 -5
  211. aiagents4pharma/talk2scholars/tests/{test_arxiv_downloader.py → test_utils_arxiv_downloader.py} +16 -25
  212. aiagents4pharma/talk2scholars/tests/{test_base_paper_downloader.py → test_utils_base_paper_downloader.py} +25 -47
  213. aiagents4pharma/talk2scholars/tests/{test_biorxiv_downloader.py → test_utils_biorxiv_downloader.py} +14 -42
  214. aiagents4pharma/talk2scholars/tests/{test_medrxiv_downloader.py → test_utils_medrxiv_downloader.py} +15 -49
  215. aiagents4pharma/talk2scholars/tests/{test_nvidia_nim_reranker.py → test_utils_nvidia_nim_reranker.py} +6 -16
  216. aiagents4pharma/talk2scholars/tests/{test_pdf_answer_formatter.py → test_utils_pdf_answer_formatter.py} +1 -0
  217. aiagents4pharma/talk2scholars/tests/{test_pdf_batch_processor.py → test_utils_pdf_batch_processor.py} +6 -15
  218. aiagents4pharma/talk2scholars/tests/{test_pdf_collection_manager.py → test_utils_pdf_collection_manager.py} +34 -11
  219. aiagents4pharma/talk2scholars/tests/{test_pdf_document_processor.py → test_utils_pdf_document_processor.py} +2 -3
  220. aiagents4pharma/talk2scholars/tests/{test_pdf_generate_answer.py → test_utils_pdf_generate_answer.py} +3 -6
  221. aiagents4pharma/talk2scholars/tests/{test_pdf_gpu_detection.py → test_utils_pdf_gpu_detection.py} +5 -16
  222. aiagents4pharma/talk2scholars/tests/{test_pdf_rag_pipeline.py → test_utils_pdf_rag_pipeline.py} +7 -17
  223. aiagents4pharma/talk2scholars/tests/{test_pdf_retrieve_chunks.py → test_utils_pdf_retrieve_chunks.py} +4 -11
  224. aiagents4pharma/talk2scholars/tests/{test_pdf_singleton_manager.py → test_utils_pdf_singleton_manager.py} +26 -23
  225. aiagents4pharma/talk2scholars/tests/{test_pdf_vector_normalization.py → test_utils_pdf_vector_normalization.py} +1 -1
  226. aiagents4pharma/talk2scholars/tests/{test_pdf_vector_store.py → test_utils_pdf_vector_store.py} +27 -55
  227. aiagents4pharma/talk2scholars/tests/{test_pubmed_downloader.py → test_utils_pubmed_downloader.py} +31 -91
  228. aiagents4pharma/talk2scholars/tests/{test_read_helper_utils.py → test_utils_read_helper_utils.py} +2 -6
  229. aiagents4pharma/talk2scholars/tests/{test_s2_utils_ext_ids.py → test_utils_s2_utils_ext_ids.py} +5 -15
  230. aiagents4pharma/talk2scholars/tests/{test_zotero_human_in_the_loop.py → test_utils_zotero_human_in_the_loop.py} +6 -13
  231. aiagents4pharma/talk2scholars/tests/{test_zotero_path.py → test_utils_zotero_path.py} +53 -45
  232. aiagents4pharma/talk2scholars/tests/{test_zotero_read.py → test_utils_zotero_read.py} +30 -91
  233. aiagents4pharma/talk2scholars/tests/{test_zotero_write.py → test_utils_zotero_write.py} +6 -16
  234. aiagents4pharma/talk2scholars/tools/__init__.py +1 -4
  235. aiagents4pharma/talk2scholars/tools/paper_download/paper_downloader.py +20 -35
  236. aiagents4pharma/talk2scholars/tools/paper_download/utils/__init__.py +7 -5
  237. aiagents4pharma/talk2scholars/tools/paper_download/utils/arxiv_downloader.py +9 -11
  238. aiagents4pharma/talk2scholars/tools/paper_download/utils/base_paper_downloader.py +14 -21
  239. aiagents4pharma/talk2scholars/tools/paper_download/utils/biorxiv_downloader.py +14 -22
  240. aiagents4pharma/talk2scholars/tools/paper_download/utils/medrxiv_downloader.py +11 -13
  241. aiagents4pharma/talk2scholars/tools/paper_download/utils/pubmed_downloader.py +14 -28
  242. aiagents4pharma/talk2scholars/tools/pdf/question_and_answer.py +4 -8
  243. aiagents4pharma/talk2scholars/tools/pdf/utils/__init__.py +16 -14
  244. aiagents4pharma/talk2scholars/tools/pdf/utils/answer_formatter.py +4 -4
  245. aiagents4pharma/talk2scholars/tools/pdf/utils/batch_processor.py +15 -17
  246. aiagents4pharma/talk2scholars/tools/pdf/utils/collection_manager.py +2 -2
  247. aiagents4pharma/talk2scholars/tools/pdf/utils/document_processor.py +5 -5
  248. aiagents4pharma/talk2scholars/tools/pdf/utils/generate_answer.py +4 -4
  249. aiagents4pharma/talk2scholars/tools/pdf/utils/get_vectorstore.py +2 -6
  250. aiagents4pharma/talk2scholars/tools/pdf/utils/gpu_detection.py +5 -9
  251. aiagents4pharma/talk2scholars/tools/pdf/utils/nvidia_nim_reranker.py +4 -4
  252. aiagents4pharma/talk2scholars/tools/pdf/utils/paper_loader.py +2 -2
  253. aiagents4pharma/talk2scholars/tools/pdf/utils/rag_pipeline.py +6 -15
  254. aiagents4pharma/talk2scholars/tools/pdf/utils/retrieve_chunks.py +7 -15
  255. aiagents4pharma/talk2scholars/tools/pdf/utils/singleton_manager.py +2 -2
  256. aiagents4pharma/talk2scholars/tools/pdf/utils/tool_helper.py +3 -4
  257. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_normalization.py +8 -17
  258. aiagents4pharma/talk2scholars/tools/pdf/utils/vector_store.py +17 -33
  259. aiagents4pharma/talk2scholars/tools/s2/__init__.py +8 -6
  260. aiagents4pharma/talk2scholars/tools/s2/display_dataframe.py +3 -7
  261. aiagents4pharma/talk2scholars/tools/s2/multi_paper_rec.py +7 -6
  262. aiagents4pharma/talk2scholars/tools/s2/query_dataframe.py +5 -12
  263. aiagents4pharma/talk2scholars/tools/s2/retrieve_semantic_scholar_paper_id.py +2 -4
  264. aiagents4pharma/talk2scholars/tools/s2/search.py +6 -6
  265. aiagents4pharma/talk2scholars/tools/s2/single_paper_rec.py +5 -3
  266. aiagents4pharma/talk2scholars/tools/s2/utils/__init__.py +1 -3
  267. aiagents4pharma/talk2scholars/tools/s2/utils/multi_helper.py +12 -18
  268. aiagents4pharma/talk2scholars/tools/s2/utils/search_helper.py +11 -18
  269. aiagents4pharma/talk2scholars/tools/s2/utils/single_helper.py +11 -16
  270. aiagents4pharma/talk2scholars/tools/zotero/__init__.py +1 -4
  271. aiagents4pharma/talk2scholars/tools/zotero/utils/__init__.py +1 -4
  272. aiagents4pharma/talk2scholars/tools/zotero/utils/read_helper.py +21 -39
  273. aiagents4pharma/talk2scholars/tools/zotero/utils/review_helper.py +2 -6
  274. aiagents4pharma/talk2scholars/tools/zotero/utils/write_helper.py +8 -11
  275. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_path.py +4 -12
  276. aiagents4pharma/talk2scholars/tools/zotero/utils/zotero_pdf_downloader.py +13 -27
  277. aiagents4pharma/talk2scholars/tools/zotero/zotero_read.py +4 -7
  278. aiagents4pharma/talk2scholars/tools/zotero/zotero_review.py +8 -10
  279. aiagents4pharma/talk2scholars/tools/zotero/zotero_write.py +3 -2
  280. {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/METADATA +115 -51
  281. aiagents4pharma-1.45.1.dist-info/RECORD +324 -0
  282. {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/WHEEL +1 -2
  283. aiagents4pharma-1.44.0.dist-info/RECORD +0 -293
  284. aiagents4pharma-1.44.0.dist-info/top_level.txt +0 -1
  285. /aiagents4pharma/talk2scholars/tests/{test_state.py → test_states_state.py} +0 -0
  286. /aiagents4pharma/talk2scholars/tests/{test_pdf_paper_loader.py → test_utils_pdf_paper_loader.py} +0 -0
  287. /aiagents4pharma/talk2scholars/tests/{test_tool_helper_utils.py → test_utils_tool_helper_utils.py} +0 -0
  288. /aiagents4pharma/talk2scholars/tests/{test_zotero_pdf_downloader_utils.py → test_utils_zotero_pdf_downloader_utils.py} +0 -0
  289. {aiagents4pharma-1.44.0.dist-info → aiagents4pharma-1.45.1.dist-info}/licenses/LICENSE +0 -0
@@ -1,33 +1,37 @@
1
1
  #!/usr/bin/env python3
2
2
 
3
3
  """
4
- This module contains the `GetAnnotationTool` for fetching species annotations
4
+ This module contains the `GetAnnotationTool` for fetching species annotations
5
5
  based on the provided model and species names.
6
6
  """
7
- import math
8
- from typing import List, Annotated, Type, Union, Literal
7
+
9
8
  import logging
9
+ import math
10
10
  from dataclasses import dataclass
11
- import hydra
12
- from pydantic import BaseModel, Field
11
+ from typing import Annotated, Literal
12
+
13
13
  import basico
14
+ import hydra
14
15
  import pandas as pd
15
- from langgraph.types import Command
16
- from langgraph.prebuilt import InjectedState
17
- from langchain_core.tools.base import BaseTool
18
- from langchain_core.tools.base import InjectedToolCallId
19
16
  from langchain_core.messages import ToolMessage
17
+ from langchain_core.tools.base import BaseTool, InjectedToolCallId
18
+ from langgraph.prebuilt import InjectedState
19
+ from langgraph.types import Command
20
+ from pydantic import BaseModel, Field
21
+
22
+ from ..api.kegg import fetch_kegg_annotations
23
+ from ..api.ols import search_ols_labels
24
+ from ..api.uniprot import search_uniprot_labels
25
+
20
26
  # from langchain_openai import ChatOpenAI
21
27
  from .load_biomodel import ModelData, load_biomodel
22
- from ..api.uniprot import search_uniprot_labels
23
- from ..api.ols import search_ols_labels
24
- from ..api.kegg import fetch_kegg_annotations
25
28
 
26
29
  # Initialize logger
27
30
  logging.basicConfig(level=logging.INFO)
28
31
  logger = logging.getLogger(__name__)
29
32
 
30
- ols_ontology_abbreviations = {'pato', 'chebi', 'sbo', 'fma', 'pr','go'}
33
+ ols_ontology_abbreviations = {"pato", "chebi", "sbo", "fma", "pr", "go"}
34
+
31
35
 
32
36
  def extract_relevant_species_names(model_object, arg_data, state):
33
37
  """
@@ -35,11 +39,12 @@ def extract_relevant_species_names(model_object, arg_data, state):
35
39
  """
36
40
  # Load hydra configuration
37
41
  with hydra.initialize(version_base=None, config_path="../configs"):
38
- cfg = hydra.compose(config_name='config',
39
- overrides=['tools/get_annotation=default'])
42
+ cfg = hydra.compose(config_name="config", overrides=["tools/get_annotation=default"])
40
43
  cfg = cfg.tools.get_annotation
41
- logger.info("Loaded the following system prompt for the LLM"
42
- " to get a structured output: %s", cfg.prompt)
44
+ logger.info(
45
+ "Loaded the following system prompt for the LLM to get a structured output: %s",
46
+ cfg.prompt,
47
+ )
43
48
 
44
49
  # Extract all the species names from the model
45
50
  df_species = basico.model_info.get_species(model=model_object.copasi_model)
@@ -53,17 +58,19 @@ def extract_relevant_species_names(model_object, arg_data, state):
53
58
  """
54
59
  A list of species based on user question.
55
60
  """
56
- relevant_species: Union[None, List[Literal[*all_species_names]]] = Field(
57
- description="""List of species based on user question.
58
- If no relevant species are found, it must be None.""")
61
+
62
+ relevant_species: None | list[Literal[*all_species_names,]] = Field(
63
+ description="""List of species based on user question.
64
+ If no relevant species are found, it must be None."""
65
+ )
59
66
 
60
67
  # Create an instance of the LLM model
61
- llm = state['llm_model']
68
+ llm = state["llm_model"]
62
69
  # Get the structured output from the LLM model
63
70
  llm_with_structured_output = llm.with_structured_output(CustomHeader)
64
71
  # Define the question for the LLM model using the prompt
65
72
  question = cfg.prompt
66
- question += f'Here is the user question: {arg_data.user_question}'
73
+ question += f"Here is the user question: {arg_data.user_question}"
67
74
  # Invoke the LLM model with the user question
68
75
  results = llm_with_structured_output.invoke(question)
69
76
  logging.info("Results from the LLM model: %s", results)
@@ -78,82 +85,95 @@ def extract_relevant_species_names(model_object, arg_data, state):
78
85
  logger.info("Extracted species: %s", extracted_species)
79
86
  return extracted_species
80
87
 
81
- def prepare_content_msg(species_without_description: List[str]):
88
+
89
+ def prepare_content_msg(species_without_description: list[str]):
82
90
  """
83
91
  Prepare the content message.
84
92
  """
85
- content = 'Successfully extracted annotations for the species.'
93
+ content = "Successfully extracted annotations for the species."
86
94
  if species_without_description:
87
- content += f'''The descriptions for the following species
95
+ content += f"""The descriptions for the following species
88
96
  were not found:
89
- {", ".join(species_without_description)}.'''
97
+ {", ".join(species_without_description)}."""
90
98
  return content
91
99
 
100
+
92
101
  @dataclass
93
102
  class ArgumentData:
94
103
  """
95
104
  Dataclass for storing the argument data.
96
105
  """
97
- experiment_name: Annotated[str, "An AI assigned _ separated name of"
98
- " the experiment based on human query"
99
- " and the context of the experiment."
100
- " This must be set before the experiment is run."]
106
+
107
+ experiment_name: Annotated[
108
+ str,
109
+ "An AI assigned _ separated name of"
110
+ " the experiment based on human query"
111
+ " and the context of the experiment."
112
+ " This must be set before the experiment is run.",
113
+ ]
101
114
  user_question: Annotated[str, "Description of the user question"]
102
115
 
116
+
103
117
  class GetAnnotationInput(BaseModel):
104
118
  """
105
119
  Input schema for annotation tool.
106
120
  """
121
+
107
122
  arg_data: ArgumentData = Field(description="argument data")
108
123
  sys_bio_model: ModelData = Field(description="model data")
109
124
  tool_call_id: Annotated[str, InjectedToolCallId]
110
125
  state: Annotated[dict, InjectedState]
111
126
 
127
+
112
128
  class GetAnnotationTool(BaseTool):
113
129
  """
114
130
  Tool for fetching species annotations based on the provided model and species names.
115
131
  """
132
+
116
133
  name: str = "get_annotation"
117
- description: str = '''A tool to extract annotations for a list of species names
134
+ description: str = """A tool to extract annotations for a list of species names
118
135
  based on the provided model. Annotations include
119
136
  the species name, description, database, ID, link,
120
137
  and qualifier. The tool can handle multiple species
121
- in a single invoke.'''
122
- args_schema: Type[BaseModel] = GetAnnotationInput
138
+ in a single invoke."""
139
+ args_schema: type[BaseModel] = GetAnnotationInput
123
140
  return_direct: bool = False
124
141
 
125
- def _run(self,
126
- arg_data: ArgumentData,
127
- tool_call_id: Annotated[str, InjectedToolCallId],
128
- state: Annotated[dict, InjectedState],
129
- sys_bio_model: ModelData = None) -> str:
142
+ def _run(
143
+ self,
144
+ arg_data: ArgumentData,
145
+ tool_call_id: Annotated[str, InjectedToolCallId],
146
+ state: Annotated[dict, InjectedState],
147
+ sys_bio_model: ModelData = None,
148
+ ) -> str:
130
149
  """
131
150
  Run the tool.
132
151
  """
133
- logger.info("Running the GetAnnotationTool tool for species %s, %s",
134
- arg_data.user_question,
135
- arg_data.experiment_name)
152
+ logger.info(
153
+ "Running the GetAnnotationTool tool for species %s, %s",
154
+ arg_data.user_question,
155
+ arg_data.experiment_name,
156
+ )
136
157
 
137
158
  # Prepare the model object
138
- sbml_file_path = state['sbml_file_path'][-1] if state['sbml_file_path'] else None
159
+ sbml_file_path = state["sbml_file_path"][-1] if state["sbml_file_path"] else None
139
160
  model_object = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
140
161
 
141
162
  # Extract relevant species names based on the user question
142
163
  list_species_names = extract_relevant_species_names(model_object, arg_data, state)
143
- print (list_species_names)
164
+ print(list_species_names)
144
165
 
145
- (annotations_df,
146
- species_without_description) = self._fetch_annotations(list_species_names)
166
+ (annotations_df, species_without_description) = self._fetch_annotations(list_species_names)
147
167
 
148
168
  # Process annotations
149
169
  annotations_df = self._process_annotations(annotations_df)
150
170
 
151
171
  # Prepare the simulated data
152
172
  dic_annotations_data = {
153
- 'name': arg_data.experiment_name,
154
- 'source': sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else 'upload',
155
- 'tool_call_id': tool_call_id,
156
- 'data': annotations_df.to_dict()
173
+ "name": arg_data.experiment_name,
174
+ "source": (sys_bio_model.biomodel_id if sys_bio_model.biomodel_id else "upload"),
175
+ "tool_call_id": tool_call_id,
176
+ "data": annotations_df.to_dict(),
157
177
  }
158
178
 
159
179
  # Update the state with the annotations data
@@ -161,24 +181,25 @@ class GetAnnotationTool(BaseTool):
161
181
  for key, value in {
162
182
  "model_id": [sys_bio_model.biomodel_id],
163
183
  "sbml_file_path": [sbml_file_path],
164
- "dic_annotations_data": [dic_annotations_data]
184
+ "dic_annotations_data": [dic_annotations_data],
165
185
  }.items():
166
186
  if value:
167
187
  dic_updated_state_for_model[key] = value
168
188
 
169
189
  return Command(
170
- update=dic_updated_state_for_model | {
190
+ update=dic_updated_state_for_model
191
+ | {
171
192
  "messages": [
172
193
  ToolMessage(
173
194
  content=prepare_content_msg(species_without_description),
174
195
  artifact=True,
175
- tool_call_id=tool_call_id
196
+ tool_call_id=tool_call_id,
176
197
  )
177
198
  ]
178
199
  }
179
200
  )
180
201
 
181
- def _fetch_annotations(self, list_species_names: List[str]) -> tuple:
202
+ def _fetch_annotations(self, list_species_names: list[str]) -> tuple:
182
203
  """
183
204
  Fetch annotations for the given species names from the model.
184
205
  In this method, we fetch the MIRIAM annotations for the species names.
@@ -210,11 +231,13 @@ class GetAnnotationTool(BaseTool):
210
231
 
211
232
  # Loop through the descriptions and add them to the data list
212
233
  for desc in descriptions:
213
- data.append({
214
- "Species Name": species,
215
- "Link": desc["id"],
216
- "Qualifier": desc["qualifier"]
217
- })
234
+ data.append(
235
+ {
236
+ "Species Name": species,
237
+ "Link": desc["id"],
238
+ "Qualifier": desc["qualifier"],
239
+ }
240
+ )
218
241
 
219
242
  # Create a dataframe from the data list
220
243
  annotations_df = pd.DataFrame(data)
@@ -238,22 +261,23 @@ class GetAnnotationTool(BaseTool):
238
261
  logger.info("Processing annotations.")
239
262
  # Add a new column for the ID
240
263
  # Get the ID from the link key
241
- annotations_df['Id'] = annotations_df['Link'].str.split('/').str[-1]
264
+ annotations_df["Id"] = annotations_df["Link"].str.split("/").str[-1]
242
265
 
243
266
  # Add a new column for the database
244
267
  # Get the database from the link key
245
- annotations_df['Database'] = annotations_df['Link'].str.split('/').str[-2]
268
+ annotations_df["Database"] = annotations_df["Link"].str.split("/").str[-2]
246
269
 
247
270
  # Fetch descriptions for the IDs based on the database type
248
271
  # by qyerying the respective APIs
249
- identifiers = annotations_df[['Id', 'Database']].to_dict(orient='records')
272
+ identifiers = annotations_df[["Id", "Database"]].to_dict(orient="records")
250
273
  descriptions = self._fetch_descriptions(identifiers)
251
274
 
252
275
  # Add a new column for the description
253
276
  # Get the description from the descriptions dictionary
254
277
  # based on the ID. If the description is not found, use '-'
255
- annotations_df['Description'] = annotations_df['Id'].apply(lambda x:
256
- descriptions.get(x, '-'))
278
+ annotations_df["Description"] = annotations_df["Id"].apply(
279
+ lambda x: descriptions.get(x, "-")
280
+ )
257
281
  # annotations_df.index = annotations_df.index + 1
258
282
 
259
283
  # Reorder the columns
@@ -272,13 +296,13 @@ class GetAnnotationTool(BaseTool):
272
296
  Process link to format it correctly.
273
297
  """
274
298
  for ols_ontology_abbreviation in ols_ontology_abbreviations:
275
- if ols_ontology_abbreviation +'/' in link:
299
+ if ols_ontology_abbreviation + "/" in link:
276
300
  link = link.replace(f"{ols_ontology_abbreviation}/", "")
277
301
  if "kegg.compound" in link:
278
302
  link = link.replace("kegg.compound/", "kegg.compound:")
279
303
  return link
280
304
 
281
- def _fetch_descriptions(self, data: List[dict[str, str]]) -> dict[str, str]:
305
+ def _fetch_descriptions(self, data: list[dict[str, str]]) -> dict[str, str]:
282
306
  """
283
307
  Fetch protein names or labels based on the database type.
284
308
  """
@@ -290,8 +314,8 @@ class GetAnnotationTool(BaseTool):
290
314
  # and a list of identifiers as the value. If either the database or the
291
315
  # identifier is NaN, we set it to None.
292
316
  for entry in data:
293
- identifier = entry.get('Id')
294
- database = entry.get('Database')
317
+ identifier = entry.get("Id")
318
+ database = entry.get("Database")
295
319
  # Check if database is NaN
296
320
  if isinstance(database, float):
297
321
  if math.isnan(database):
@@ -306,18 +330,18 @@ class GetAnnotationTool(BaseTool):
306
330
  # Constants
307
331
 
308
332
  for database, identifiers in grouped_data.items():
309
- if database == 'uniprot':
333
+ if database == "uniprot":
310
334
  results.update(search_uniprot_labels(identifiers))
311
335
  elif database in ols_ontology_abbreviations:
312
- annotations = search_ols_labels([
313
- {"Id": id_, "Database": database}
314
- for id_ in identifiers
315
- ])
336
+ annotations = search_ols_labels(
337
+ [{"Id": id_, "Database": database} for id_ in identifiers]
338
+ )
316
339
  for identifier in identifiers:
317
340
  results[identifier] = annotations.get(database, {}).get(identifier, "-")
318
- elif database == 'kegg.compound':
319
- data = [{"Id": identifier, "Database": "kegg.compound"}
320
- for identifier in identifiers]
341
+ elif database == "kegg.compound":
342
+ data = [
343
+ {"Id": identifier, "Database": "kegg.compound"} for identifier in identifiers
344
+ ]
321
345
  annotations = fetch_kegg_annotations(data)
322
346
  for identifier in identifiers:
323
347
  results[identifier] = annotations.get(database, {}).get(identifier, "-")
@@ -5,26 +5,30 @@ Tool for get model information.
5
5
  """
6
6
 
7
7
  import logging
8
- from typing import Type, Optional, Annotated
9
8
  from dataclasses import dataclass
9
+ from typing import Annotated
10
+
10
11
  import basico
11
- from pydantic import BaseModel, Field
12
- from langchain_core.tools import BaseTool
13
12
  from langchain_core.messages import ToolMessage
13
+ from langchain_core.tools import BaseTool
14
14
  from langchain_core.tools.base import InjectedToolCallId
15
15
  from langgraph.prebuilt import InjectedState
16
16
  from langgraph.types import Command
17
+ from pydantic import BaseModel, Field
18
+
17
19
  from .load_biomodel import ModelData, load_biomodel
18
20
 
19
21
  # Initialize logger
20
22
  logging.basicConfig(level=logging.INFO)
21
23
  logger = logging.getLogger(__name__)
22
24
 
25
+
23
26
  @dataclass
24
27
  class RequestedModelInfo:
25
28
  """
26
29
  Dataclass for storing the requested model information.
27
30
  """
31
+
28
32
  species: bool = Field(description="Get species from the model.", default=False)
29
33
  parameters: bool = Field(description="Get parameters from the model.", default=False)
30
34
  compartments: bool = Field(description="Get compartments from the model.", default=False)
@@ -32,33 +36,38 @@ class RequestedModelInfo:
32
36
  description: bool = Field(description="Get description from the model.", default=False)
33
37
  name: bool = Field(description="Get name from the model.", default=False)
34
38
 
39
+
35
40
  class GetModelInfoInput(BaseModel):
36
41
  """
37
42
  Input schema for the GetModelInfo tool.
38
43
  """
44
+
39
45
  requested_model_info: RequestedModelInfo = Field(description="requested model information")
40
46
  sys_bio_model: ModelData = Field(description="model data")
41
47
  tool_call_id: Annotated[str, InjectedToolCallId]
42
48
  state: Annotated[dict, InjectedState]
43
49
 
50
+
44
51
  # Note: It's important that every field has type hints. BaseTool is a
45
52
  # Pydantic class and not having type hints can lead to unexpected behavior.
46
53
  class GetModelInfoTool(BaseTool):
47
54
  """
48
55
  This tool ise used extract model information.
49
56
  """
57
+
50
58
  name: str = "get_modelinfo"
51
59
  description: str = """A tool for extracting name,
52
60
  description, species, parameters,
53
61
  compartments, and units from a model."""
54
- args_schema: Type[BaseModel] = GetModelInfoInput
55
-
56
- def _run(self,
57
- requested_model_info: RequestedModelInfo,
58
- tool_call_id: Annotated[str, InjectedToolCallId],
59
- state: Annotated[dict, InjectedState],
60
- sys_bio_model: Optional[ModelData] = None,
61
- ) -> Command:
62
+ args_schema: type[BaseModel] = GetModelInfoInput
63
+
64
+ def _run(
65
+ self,
66
+ requested_model_info: RequestedModelInfo,
67
+ tool_call_id: Annotated[str, InjectedToolCallId],
68
+ state: Annotated[dict, InjectedState],
69
+ sys_bio_model: ModelData | None = None,
70
+ ) -> Command:
62
71
  """
63
72
  Run the tool.
64
73
 
@@ -71,14 +80,15 @@ class GetModelInfoTool(BaseTool):
71
80
  Returns:
72
81
  Command: The updated state of the tool.
73
82
  """
74
- logger.log(logging.INFO,
75
- "Calling get_modelinfo tool %s, %s",
76
- sys_bio_model,
77
- requested_model_info)
83
+ logger.log(
84
+ logging.INFO,
85
+ "Calling get_modelinfo tool %s, %s",
86
+ sys_bio_model,
87
+ requested_model_info,
88
+ )
78
89
  # print (state, 'state')
79
- sbml_file_path = state['sbml_file_path'][-1] if len(state['sbml_file_path']) > 0 else None
80
- model_obj = load_biomodel(sys_bio_model,
81
- sbml_file_path=sbml_file_path)
90
+ sbml_file_path = state["sbml_file_path"][-1] if len(state["sbml_file_path"]) > 0 else None
91
+ model_obj = load_biomodel(sys_bio_model, sbml_file_path=sbml_file_path)
82
92
  dic_results = {}
83
93
  # Extract species from the model
84
94
  if requested_model_info.species:
@@ -87,15 +97,18 @@ class GetModelInfoTool(BaseTool):
87
97
  raise ValueError("Unable to extract species from the model.")
88
98
  # Convert index into a column
89
99
  df_species.reset_index(inplace=True)
90
- dic_results['Species'] = df_species[
91
- ['name',
92
- 'compartment',
93
- 'type',
94
- 'unit',
95
- 'initial_concentration',
96
- 'display_name']]
100
+ dic_results["Species"] = df_species[
101
+ [
102
+ "name",
103
+ "compartment",
104
+ "type",
105
+ "unit",
106
+ "initial_concentration",
107
+ "display_name",
108
+ ]
109
+ ]
97
110
  # Convert this into a dictionary
98
- dic_results['Species'] = dic_results['Species'].to_dict(orient='records')
111
+ dic_results["Species"] = dic_results["Species"].to_dict(orient="records")
99
112
 
100
113
  # Extract parameters from the model
101
114
  if requested_model_info.parameters:
@@ -104,50 +117,43 @@ class GetModelInfoTool(BaseTool):
104
117
  raise ValueError("Unable to extract parameters from the model.")
105
118
  # Convert index into a column
106
119
  df_parameters.reset_index(inplace=True)
107
- dic_results['Parameters'] = df_parameters[
108
- ['name',
109
- 'type',
110
- 'unit',
111
- 'initial_value',
112
- 'display_name']]
120
+ dic_results["Parameters"] = df_parameters[
121
+ ["name", "type", "unit", "initial_value", "display_name"]
122
+ ]
113
123
  # Convert this into a dictionary
114
- dic_results['Parameters'] = dic_results['Parameters'].to_dict(orient='records')
124
+ dic_results["Parameters"] = dic_results["Parameters"].to_dict(orient="records")
115
125
 
116
126
  # Extract compartments from the model
117
127
  if requested_model_info.compartments:
118
128
  df_compartments = basico.model_info.get_compartments(model=model_obj.copasi_model)
119
- dic_results['Compartments'] = df_compartments.index.tolist()
120
- dic_results['Compartments'] = ','.join(dic_results['Compartments'])
129
+ dic_results["Compartments"] = df_compartments.index.tolist()
130
+ dic_results["Compartments"] = ",".join(dic_results["Compartments"])
121
131
 
122
132
  # Extract description from the model
123
133
  if requested_model_info.description:
124
- dic_results['Description'] = model_obj.description
134
+ dic_results["Description"] = model_obj.description
125
135
 
126
136
  # Extract description from the model
127
137
  if requested_model_info.name:
128
- dic_results['Name'] = model_obj.name
138
+ dic_results["Name"] = model_obj.name
129
139
 
130
140
  # Extract time unit from the model
131
141
  if requested_model_info.units:
132
- dic_results['Units'] = basico.model_info.get_model_units(model=model_obj.copasi_model)
142
+ dic_results["Units"] = basico.model_info.get_model_units(model=model_obj.copasi_model)
133
143
 
134
144
  # Prepare the dictionary of updated state for the model
135
145
  dic_updated_state_for_model = {}
136
146
  for key, value in {
137
- "model_id": [sys_bio_model.biomodel_id],
138
- "sbml_file_path": [sbml_file_path],
139
- }.items():
147
+ "model_id": [sys_bio_model.biomodel_id],
148
+ "sbml_file_path": [sbml_file_path],
149
+ }.items():
140
150
  if value:
141
151
  dic_updated_state_for_model[key] = value
142
152
 
143
153
  return Command(
144
- update=dic_updated_state_for_model|{
145
- # update the message history
146
- "messages": [
147
- ToolMessage(
148
- content=dic_results,
149
- tool_call_id=tool_call_id
150
- )
151
- ],
152
- }
153
- )
154
+ update=dic_updated_state_for_model
155
+ | {
156
+ # update the message history
157
+ "messages": [ToolMessage(content=dic_results, tool_call_id=tool_call_id)],
158
+ }
159
+ )